crypt
Version, currently 1.0.04 versions
- 1.0.0latestMar 26, 2021
- 0.1.2not indexedMar 26, 2021
- 0.1.1not indexedMar 26, 2021
- 0.1.0not indexedMar 26, 2021
github.com/Nicolab/crystal-crypt
:gem: Cryptographic utilities made easy for Crystal lang.
8 stars
0 dependents
License: MIT
Installation
# Add this to your shard.yml
dependencies:
crypt:
github: Nicolab/crystal-crypt
version: ~> 1.0.0Then run:
shards installshard.yml
- Crystal
>= 0.36.1- License
- MIT
- Author
- Nicolas Talle <dev@nicolab.net>
- Target
cryptfrom src/crypt.cr
Dependencies
Development Dependencies
- ameba~> 0.14.1github: crystal-ameba/amebadev
README
# Crypt
[](https://github.com/Nicolab/crystal-crypt/actions) [](https://github.com/Nicolab/crystal-crypt/releases) [](https://nicolab.github.io/crystal-crypt/)
Cryptographic utilities made easy for [Crystal lang](https://crystal-lang.org).
This module provides cryptographic features, with abstractions on top of OpenSSL
and Crypto (included in the Crystal standard-library).
## Installation
1. Add the dependency to your `shard.yml`:
```yaml
dependencies:
crypt:
github: nicolab/crystal-crypt
```
2. Run `shards install`
## Usage
To optimize the size of the final binary, features are decoupled,
so each module must be included when you need it.
### OpenSSL Cipher: Encrypt / Decrypt
> [API doc: Crypt::Crypter](https://nicolab.github.io/crystal-crypt/Crypt/Crypter.html)
```crystal
require "crypt"
require "crypt/crypter"
require "crypt/random"
data = "super secret data"
secret = Crypt.random_string(32)
crypter = Crypt::Crypter.new(secret)
# Data encrypted
encrypted = crypter.encrypt(data)
# Data decrypted
decrypted_bytes = crypter.decrypt(encrypted)
# Decrypted data (Bytes)
puts decrypted_bytes
# Convert Bytes to String
puts String.new(decrypted_bytes)
```
#### With signature
Encrypt with a crypto signature:
```crystal
require "crypt"
require "crypt/crypter"
require "crypt/random"
data = "super secret data"
secret = Crypt.random_string(32)
crypter = Crypt::Crypter.new(secret)
# Data encrypted and signed
encrypted = crypter.encrypt(data, :sign)
# Data verified and decrypted
decrypted_bytes = crypter.decrypt(encrypted, :sign)
# Decrypted data (Bytes)
puts decrypted_bytes
# Convert Bytes to String
puts String.new(decrypted_bytes)
```
### Signer
Sign and verify given data.
```crystal
require "crypt"
require "crypt/signer"
data = "Hello Crystal!"
secret = "super secret"
signer = Crypt::Signer.new(secret)
# Sign the data
signed_data = signer.sign(data)
# => Encoded String, URL and filename safe alphabet (RFC 4648).
puts signed_data
# Verify the data integrity and get it
puts signer.verify(signed_data) # => "Hello Crystal!"
puts signer.verify(signed_data) == data # => true
```
> [API doc: Crypt::Signer](https://nicolab.github.io/crystal-crypt/Crypt/Signer.html)
### Bcrypt password
Generate, read and verify `Crypto::Bcrypt` hashes:
```crystal
require "crypt"
require "crypt/bcrypt"
password = Crypt.create_bcrypt_password("super secret", cost: 10)
# => $2a$10$rI4xRiuAN2fyiKwynO6PPuorfuoM4L2PVv6hlnVJEmNLjqcibAfHq
password.verify("wrong secret") # => false
password.verify("super secret") # => true
```
> [API doc: Crypt.create_bcrypt_password](https://nicolab.github.io/crystal-crypt/Crypt.html#create_bcrypt_password)
---
Loads a `Bcrypt` password hash.
```crystal
require "crypt"
require "crypt/bcrypt"
password = Crypt.load_bcrypt_password(
"$2a$10$X6rw/jDiLBuzHV./JjBNXe8/Po4wTL0fhdDNdAdjcKN/Fup8tGCya"
)
password.version # => "2a"
password.salt # => "X6rw/jDiLBuzHV./JjBNXe"
password.digest # => "8/Po4wTL0fhdDNdAdjcKN/Fup8tGCya"
# password.verify("some secret")
```
> [API doc: Crypt.load_bcrypt_password](https://nicolab.github.io/crystal-crypt/Crypt.html#load_bcrypt_password)
### Secure random
```crystal
require "crypt"
require "crypt/random"
```
See API doc:
* [API doc: Crypt.random_string](https://nicolab.github.io/crystal-crypt/Crypt.html#random_string)
* [API doc: Crypt.random_bytes](https://nicolab.github.io/crystal-crypt/Crypt.html#random_bytes)
* [API doc: Crypt.random_bytes_string](https://nicolab.github.io/crystal-crypt/Crypt.html#random_bytes_string)
### Key derivation
Key derivation PKCS5/PBKDF2 (Password-Based Key Derivation Function 2)
```crystal
require "crypt"
require "crypt/key-deriv"
require "crypt/random"
password = "My password"
salt = Crypt.random_string(16)
# key size: 64
Crypt.key_deriv(password, salt)
# key size: 10
Crypt.key_deriv(password, salt, key_size: 10)
# iteration: 2000
Crypt.key_deriv(password, salt, iter: 2000)
# algo: sha256
Crypt.key_deriv(password, salt, algo: :sha256)
```
> [API doc: Crypt.key_deriv](https://nicolab.github.io/crystal-crypt/Crypt.html#key_deriv)
## Contributing
1. Fork it (<https://github.com/nicolab/crystal-crypt/fork>)
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create a new Pull Request
### Development
One line:
```sh
./scripts/develop
```
or splitted:
Terminal 1:
```sh
docker-compose up
```
Terminal 2:
```sh
# host
docker-compose exec app bash
# container
just develop
```
When you are done, clean and check the code:
```sh
# container
just format
# host
./scripts/check
```
## LICENSE
[MIT](https://github.com/Nicolab/crystal-crypt/blob/master/LICENSE) (c) 2020, Nicolas Talle.
## Author
| [](https://github.com/sponsors/Nicolab) |
|---|
| [Nicolas Talle](https://github.com/sponsors/Nicolab) |
| [](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=PGRH4ZXP36GUC) |
Documentation
Built from the current release. The first visit to a release nobody has asked for starts its build.
Links
This release
- Version
1.0.0- Tagged
- Mar 26, 2021
- Commit
5b634ad8db65- Crystal
>= 0.36.1- Indexed
- yes
Dependents
No indexed shard depends on this one yet.
Repository
github.com/Nicolab/crystal-crypt
Metadata
- Created
- Aug 12, 2026
- Updated
- Aug 13, 2026
- Synced
- Aug 13, 2026
- Versions
- 4