我正在尝试用Ruby重新实现c#代码。以下代码(具有不同的秘密)用于解密文件:
using System.IO;
using System.Security.Cryptography;
using System.Text;
public static class Decrypt {
private const string KEY = "FOOBARB";
private static readonly byte[] IV = {
126, 36, 216, 236, 247, 79, 205, 111, 240, 119, 197, 10, 19, 216, 139, 91
};
public static Stream ReadEncryptedFile(string filePath) {
var fs = new FileStream(
filePath,
FileMode.OpenOrCreate,
FileAccess.ReadWrite
);
byte[] key = new UnicodeEncoding().GetBytes(KEY);
byte[] vector = IV;
using (var rijndaelEncryption = new RijndaelManaged()) {
var decryptor = rijndaelEncryption.CreateDecryptor(key, vector);
return new CryptoStream(fs, decryptor, CryptoStreamMode.Read);
}
}
public static void Main() {
var crReader = ReadEncryptedFile(
"/path/to/file"
);
StreamReader reader = new StreamReader(crReader);
System.Console.WriteLine(reader.ReadToEnd());
}
}
我知道CBC
是正确的密码模式,因为System.Console.WriteLine(rijndaelEncryption.Mode)
返回CBC
。我知道输入和输出块大小是256位,因为decryptor.OutputBlockSize
和decryptor.InputBlockSize
都返回
无论如何,当我运行以下Ruby代码时,我得到了in 'key=': key length too short (OpenSSL::Cipher::CipherError)
(我也尝试了128位和192位版本的AES/CBC,尽管这里不应该有什么不同):
require 'openssl'
f = File.read(
'path/to/file'
)
key = 'FOOBARB'
iv = [126, 36, 216, 236, 247, 79, 205, 111, 240, 119, 197, 10, 19, 216, 139, 91]
.pack('c*')
cipher = OpenSSL::Cipher.new('AES-256-CBC')
cipher.decrypt
cipher.key = key
cipher.iv = iv
puts cipher.update(f)
所以,我认为有三个问题:
- c#如何填充56位密钥使其与至少需要128位密钥的算法一起工作?
- Rijndael和AES之间的差异是否对我尝试使用Ruby的OpenSSL库进行此任务致命?
- 一旦/如果我得到的关键工作,我将需要担心字符编码,如这里所述?
谢谢。
如果您试图将Rijndael与AES一起使用,则需要将块大小设置为128位(16字节),这是AES支持的唯一块大小。许多Rijndael实现调用约定指定块大小,密钥大小由提供的密钥决定。
AES密钥大小为128、192或256位,最好提供完全正确的大小,不要依赖于实现依赖的密钥填充。