将AES 256函数从node js转换为ruby
你好,我有一个节点js版本将AES 256函数从node js转换为ruby,ruby,node.js,encryption,Ruby,Node.js,Encryption,你好,我有一个节点js版本AES-256-cbcencrpt和decrypt函数 我想把它转换成Ruby版本 遗憾的是,它没有起作用 我想知道为什么没有(NodeJS版本中的初始向量) 我最感兴趣的是 如何将以下内容转换为Ruby Message_buf.fill('\0'); cipher.setAutoPadding(auto_padding = false); 节点JS 函数加密(文本){ var cipher=crypto.createCipher('aes-256-cbc',
AES-256-cbc
encrpt和decrypt函数
我想把它转换成Ruby版本
遗憾的是,它没有起作用
我想知道为什么没有(NodeJS版本中的初始向量)
我最感兴趣的是
如何将以下内容转换为Ruby
Message_buf.fill('\0');
cipher.setAutoPadding(auto_padding = false);
节点JS
函数加密(文本){
var cipher=crypto.createCipher('aes-256-cbc','fldknow'))
var Message_buf=新缓冲区(Text.length+(16-Text.length%16));
消息填充('\0');
消息写入(文本,0,文本长度);
cipher.setAutoPadding(自动填充=false);
//var crypted=cipher.update(文本,'utf8','hex')
var crypted=cipher.update(消息_buf,'utf8','binary')
crypted+=cipher.final('binary');
返回加密;
}
函数解密(文本){
var decipher=crypto.createDecipher('aes-256-cbc','fldknow'))
decipher.setAutoPadding(自动填充=false);
var dec=decipher.update(文本,'binary','utf8')
dec+=最终破译('utf8');
var pos=dec.indexOf('\0');
如果(位置<0)
{
返回12月;
}
其他的
{
返回十二月切片(0,位置);
}
}
红宝石
def aes256_cbc_encrypt(数据,key='fldknow',=“231vxw”)
key=Digest::SHA256.Digest(key)
=摘要::MD5.Digest()
aes=OpenSSL::Cipher.new('aes-256-CBC')
加密
aes.key=key
aes=@随机的_
加密的_data=aes.update(data)这里是脚本的工作版本。
Openssl密码有点麻烦,因为密钥和数据的长度需要是位长度(256、384或512)的倍数,在您的示例中是32字节。
cipher.padding=0圈自动填充(否则为错误),因此您必须自己填充密钥和数据。使用随机生成的私钥并非真正必要,但建议使用
require 'openssl'
def encrypt text, key
cipher = OpenSSL::Cipher.new('AES-256-CBC')
private_key = cipher.random_iv
cipher.encrypt
cipher.padding = 0 #**
cipher.key = key
[private_key, cipher.update(text) + cipher.final]
end
def decrypt encrypted, public_key, private_key
decipher = OpenSSL::Cipher.new('AES-256-CBC')
decipher.decrypt
decipher.padding = 0 #**
decipher.key = public_key
decipher.iv = private_key
decipher.update(encrypted) << decipher.final
end
def pad text, length=32
text.ljust length
end
text = pad('Hello World') #pad with spaces so the lebgth is a multitude of 32 (=AES-256-CBC = 256 bits)
public_key = 'this_must_be_a_string_of_32_char'
encrypted = encrypt text, public_key
p encrypted #this is an array of the random generated private_key and the encrypted data
private_key = encrypted[0]
encrypted_data = encrypted[1]
decrypted = decrypt encrypted_data, public_key, private_key
puts text == decrypted
puts decrypted.strip
# gives
# ["G\xF8\x9B`\x8FQ\x15\x9F>xN\x0Ex\xCF\x9A\xAA", "\xB5\xE1\v\xCAU\xBE\x18UZv\xC2\xA7\xDE\x8FI\x02\xE4\x83\xB4\x9E\x04-\x13q_\x9E\xC8[n\xE5;b"]
# true
# Hello World
#** out of the documentation
# padding = integer → integer
# Enables or disables padding. By default encryption operations are padded using standard block padding and the padding is checked and removed when decrypting. If the pad parameter is zero then no padding is performed, the total amount of data encrypted or decrypted must then be a multiple of the block size or an error will occur.
# See EVP_CIPHER_CTX_set_padding for further information.
需要“openssl”
加密文本、密钥
cipher=OpenSSL::cipher.new('AES-256-CBC')
私钥=cipher.random\u iv
加密
cipher.padding=0#**
cipher.key=密钥
[私钥,密码。更新(文本)+密码。最终版本]
结束
def解密加密、公钥、私钥
decipher=OpenSSL::Cipher.new('AES-256-CBC')
解密
decipher.padding=0#**
decipher.key=公钥
decipher.iv=私钥
解密更新(加密)
def aes256_cbc_encrypt(data,key='fldkfew', ="231vxw")
key = Digest::SHA256.digest(key)
= Digest::MD5.digest()
aes = OpenSSL::Cipher.new('AES-256-CBC')
aes.encrypt
aes.key = key
aes. = @random_
encrypted_data = aes.update(data) << aes.final
p "encrypted_data:"+encrypted_data
return encrypted_data
end
def aes256_cbc_decrypt(data,key='fldkfew', ="231vxw")
key = Digest::SHA256.digest(key)
= @random_
aes = OpenSSL::Cipher.new('AES-256-CBC')
aes.decrypt
aes.key = key
aes. = @random_
aes.update(data._s) + aes.final
end
require 'openssl'
def encrypt text, key
cipher = OpenSSL::Cipher.new('AES-256-CBC')
private_key = cipher.random_iv
cipher.encrypt
cipher.padding = 0 #**
cipher.key = key
[private_key, cipher.update(text) + cipher.final]
end
def decrypt encrypted, public_key, private_key
decipher = OpenSSL::Cipher.new('AES-256-CBC')
decipher.decrypt
decipher.padding = 0 #**
decipher.key = public_key
decipher.iv = private_key
decipher.update(encrypted) << decipher.final
end
def pad text, length=32
text.ljust length
end
text = pad('Hello World') #pad with spaces so the lebgth is a multitude of 32 (=AES-256-CBC = 256 bits)
public_key = 'this_must_be_a_string_of_32_char'
encrypted = encrypt text, public_key
p encrypted #this is an array of the random generated private_key and the encrypted data
private_key = encrypted[0]
encrypted_data = encrypted[1]
decrypted = decrypt encrypted_data, public_key, private_key
puts text == decrypted
puts decrypted.strip
# gives
# ["G\xF8\x9B`\x8FQ\x15\x9F>xN\x0Ex\xCF\x9A\xAA", "\xB5\xE1\v\xCAU\xBE\x18UZv\xC2\xA7\xDE\x8FI\x02\xE4\x83\xB4\x9E\x04-\x13q_\x9E\xC8[n\xE5;b"]
# true
# Hello World
#** out of the documentation
# padding = integer → integer
# Enables or disables padding. By default encryption operations are padded using standard block padding and the padding is checked and removed when decrypting. If the pad parameter is zero then no padding is performed, the total amount of data encrypted or decrypted must then be a multiple of the block size or an error will occur.
# See EVP_CIPHER_CTX_set_padding for further information.