Я пытаюсь переопределить код C# в Ruby. Следующий код (с различными секретами) работает для расшифровки файла:C# Rijndael ключ слишком короткий в Ruby
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
оба возвращают 32. (Я понимаю, что размер ключа также входит и действительно определяет различие между AES и Rijndael, как обсуждалось here, - но я не уверен как это работает.)
Во всяком случае, я получаю in 'key=': key length too short (OpenSSL::Cipher::CipherError)
, когда запускаю следующий код Ruby (я также пробовал 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 фатальными для моей попытки использовать библиотеку OpenSSL Ruby для этой задачи?
- Однажды или если я получу ключ, мне нужно будет беспокоиться о кодировке символов, как описано here?
спасибо.
To 1: It * возможно * прокладки с 0x00 ('' \ 0''), пока ключ не будет иметь 16 байт. Кроме того, проверьте свою математику в этом утверждении: * «Я знаю, что размер входного и выходного блоков составляет 256 бит, потому что decryptor.OutputBlockSize и decryptor.InputBlockSize оба возвращают 16». * Он должен быть 128 бит. –