I use Rinjael for encoding in VB.NET and should decode in Ruby. My VB.NET encryption class is as follows:
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
this works fine and i can decrypt in java using AES / CBC / PKCS5Padding. Now my password and iv are 16 characters long (16 * 16 bits = 256). When I try to decrypt in Ruby, it complains that my password will be short ... I assume that it uses 8 bits of characters. I use this class to decrypt in ruby:
require 'openssl'
module Crypt
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
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
Now. By decrypting using Crypt.decrypt (data, key, iv, "AES-CBC-256"), I am sure that preliminary string / byte conversions should be performed on my data, key, iv for proper operation.
Crypt.decrypt key = "passwordpassword" iv = "1234567890123456"?
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")