如何解码ruby中的Rijndael(用VB.net编码)

我正在使用Rinjael在VB.NET中进行编码,需要在Ruby中进行解码。 我的VB.NET加密类看起来像这样:

Private Class Encryptor Private symmetricKey As System.Security.Cryptography.RijndaelManaged Private iVector As Byte() Private Key As Byte() Public Function encrypt(ByVal data As String) As String Try Dim plainTextBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(data) Dim encryptor As System.Security.Cryptography.ICryptoTransform = symmetricKey.CreateEncryptor(Key, iVector) Dim memoryStream As New System.IO.MemoryStream Dim cryptoStream As System.Security.Cryptography.CryptoStream = New System.Security.Cryptography.CryptoStream(memoryStream, encryptor, System.Security.Cryptography.CryptoStreamMode.Write) cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length) cryptoStream.FlushFinalBlock() Dim cipherTextBytes As Byte() = memoryStream.ToArray() memoryStream.Close() cryptoStream.Close() Return Convert.ToBase64String(cipherTextBytes) Catch Return "" End Try End Function Public Function decrypt(ByVal data As String) As String Try Dim crypted As Byte() = Convert.FromBase64String(data) Dim decryptor As System.Security.Cryptography.ICryptoTransform = symmetricKey.CreateDecryptor(Key, iVector) Dim memoryStream As New System.IO.MemoryStream(crypted) Dim cryptoStream As System.Security.Cryptography.CryptoStream = New System.Security.Cryptography.CryptoStream(memoryStream, decryptor, System.Security.Cryptography.CryptoStreamMode.Read) Dim plain(crypted.Length) As Byte Dim count As Integer = cryptoStream.Read(plain, 0, plain.Length) memoryStream.Close() cryptoStream.Close() Return System.Text.Encoding.UTF8.GetString(plain, 0, count) Catch Return "" End Try End Function Public Sub New(ByVal clientkey As String) iVector = System.Text.Encoding.ASCII.GetBytes("1234567890123456") Key = System.Text.Encoding.ASCII.GetBytes(clientkey) symmetricKey = New System.Security.Cryptography.RijndaelManaged symmetricKey.Mode = System.Security.Cryptography.CipherMode.CBC End Sub End Class 

这工作正常,我可以使用AES / CBC / PKCS5Padding在java中解密。 现在,我的密码和iv长16个字符(16 * 16bit = 256)。 当我尝试在Ruby中解密时,它抱怨我的密码很短……我认为它使用的是8位字符。 我在ruby中使用这个类进行解密:

  require 'openssl' module Crypt # Decrypts a block of data (encrypted_data) given an encryption key # and an initialization vector (iv). Keys, iv's, and the data # returned are all binary strings. Cipher_type should be # "AES-256-CBC", "AES-256-ECB", or any of the cipher types # supported by OpenSSL. Pass nil for the iv if the encryption type # doesn't use iv's (like ECB). #:return: => String #:arg: encrypted_data => String #:arg: key => String #:arg: iv => String #:arg: cipher_type => String def Crypt.decrypt(encrypted_data, key, iv, cipher_type) aes = OpenSSL::Cipher::Cipher.new(cipher_type) aes.decrypt aes.key = key aes.iv = iv if iv != nil aes.update(encrypted_data) + aes.final end # Encrypts a block of data given an encryption key and an # initialization vector (iv). Keys, iv's, and the data returned # are all binary strings. Cipher_type should be "AES-256-CBC", # "AES-256-ECB", or any of the cipher types supported by OpenSSL. # Pass nil for the iv if the encryption type doesn't use iv's (like # ECB). #:return: => String #:arg: data => String #:arg: key => String #:arg: iv => String #:arg: cipher_type => String def Crypt.encrypt(data, key, iv, cipher_type) aes = OpenSSL::Cipher::Cipher.new(cipher_type) aes.encrypt aes.key = key aes.iv = iv if iv != nil aes.update(data) + aes.final end end 

现在。 通过尝试使用Crypt.decrypt(数据,密钥,iv,“AES-CBC-256”)进行解密,我确信必须对我的数据,密钥,iv进行初步的字符串/字节转换才能正常工作。

如何使用key =“passwordpassword”和iv =“1234567890123456”调用Crypt.decrypt? 我需要base64解码我的数据吗?

这是我的解密调用,它似乎不起作用(尝试用零填充):

  text = Base64.decode64(text) pass = Digest::SHA1.hexdigest("#{@pass}0000000000000000").unpack('a2'*32).map{|x| x.hex}.pack('c'*32) iv = Digest::SHA1.hexdigest("12345678901234560000000000000000").unpack('a2'*32).map{|x| x.hex}.pack('c'*32) return Crypt.decrypt(text,pass,iv,"AES-256-CBC") 

解。 这是一个128位加密(错误地认为.NET托管中的默认值为256)。 因此,此代码有效(注意“AES-128-CBC”):

  text = Base64.decode64(text) pass = "passwordpassword" iv = "1234567890123456" return Crypt.decrypt(text,pass,iv,"AES-128-CBC") 

因为VB应用程序将结果编码为base64,所以看起来ruby脚本需要首先使用Base64模块对其进行解码。

我相信Ruby AES密钥的密钥必须是256位。 因此,在这种情况下,您的密码需要长度为32个字节。 最好使用这样的方案。