Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将AES 256函数从node js转换为ruby_Ruby_Node.js_Encryption - Fatal编程技术网

将AES 256函数从node js转换为ruby

将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',

你好,我有一个节点js版本
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.