Ccrypto::Ruby
This project is the Ruby implementation for the Ccrypto Common Crypto API.
This collection of API is meant to normalize the differences between runtimes.
Another notable implementation is Java.
Installation
Add this line to your application's Gemfile:
gem 'ccrypto'
gem 'ccrypto-ruby'
Note that gem 'ccrypto' need to precede 'ccrypto-ruby'
And then execute:
$ bundle install
Or install it yourself as:
$ gem install ccrypto
$ gem install ccrypto-ruby
Usage
All operations is driven by the config object in Ccrypto.
The following are some common operations that can easily be initiated via the respective config object.
The value of Ccrypto is the following codes should have same result when run with Java runtime using ccrypto-java gem.
Generate Secret Key
# Ccrypto::KeyConfig is the object for secret key generation
keyConfig = Ccrypto::KeyConfig.new
keyConfig.algo = :aes
keyConfig.keysize = 256
# instantiate the key generator by giving the class of Ccrypto::KeyConfig
# There are two ways to instantiate: with class and with instance.
# There are some engine which provides class methods which can be call when passing in the class.
# Engine that provides instance method requires to pass in the instance to instantiate.
keyGen = Ccrypto::AlgoFactory.engine(Ccrypto::KeyConfig)
key = keyGen.generate(keyConfig)
# key is now the AES key in 256 bits
Encrypt & Decrypt with Secret Key
# generate key
keyConfig = Ccrypto::KeyConfig.new
keyConfig.algo = :aes
keyConfig.keysize = 256
keyGen = Ccrypto::AlgoFactory.engine(Ccrypto::KeyConfig)
key = keyGen.generate(keyConfig)
cipherConfig = Ccrypto::DirectCipherConfig.new({ algo: :aes, keysize: 256, mode: :gcm, padding: :pkcs5, key: key })
cipherConfig.cipherOps = :encrypt
# library shall generate missing component such as IV if required
# and store it back into the passed in config object
cipher = Ccrypto::AlgoFactory.engine(cipherConfig)
output = []
output << cipher.update(data)
output << cipher.update(data)
output << cipher.final
res = output.join
# Encryption done!
# res now is the encrypted data
Decrypt with Secret Key
decConfig = Ccrypto::DirectCipherConfig.new({ algo: :aes, keysize: 256, mode: :gcm, padding: :pkcs5, key: key, iv: cipherConfig.iv })
# GCM mode has this additional tag
decConfig.auth_tag = cipherConfig.auth_tag
deCipher = Ccrypto::AlgoFactory.engine(decConfig)
dres = []
dres << deCipher.update(res)
dres << deCipher.final
# decryption done!
# dres is the decrypted output
Digest / Hashing
digest = Ccrypto::AlgoFactory.engine(Ccrypto::DigestConfig)
digest.digest_update("data to be digested")
res = digest.digest_final
# res is the digest output in String
hres = digest.digest_final(:hex)
# hres is the digest output converted to hex
b64res = digest.digest_final(:b64)
# b64res is the digest output converted to Base64
ECC key generation
# set the required curve name
eccConfig = CCrypto::ECCConfig.new("secp256k1")
ecc = Ccrypto::AlgoFactory.engine(Ccrypto::ECCConfig)
eccKey = ecc.generate_keypair
# eccKey shall be a ECC keypair
Refers to spec inside spec/ccrypto/xxx_spec.rb