AES 128 CFB、Java/BouncyCastle 与 Ruby/OpenSSL

我正在尝试将来自 BouncyCastle 的 Java 实现的 AES 加密与 Ruby 相匹配。不知何故,即使使用相同的密钥、IV 和有效载荷,我似乎无法在两种语言中获得相同的结果。


在这个例子中,我使用 ruby 来生成密钥和 IV,然后在 java 代码中重用这个密钥和 IV。


任何人都可以发现有什么问题吗?


这是红宝石代码:


require 'openssl'


cipher = OpenSSL::Cipher::AES.new(128, "CFB")

cipher.encrypt


payload = "\x01\x02\x03\x04".b


puts "key"

puts cipher.random_key.unpack("H*")


puts "iv"

puts cipher.random_iv.unpack("H*")


puts (cipher.update(payload) + cipher.final).unpack("H*")

它的输出:


key

19900205760f9b9696b34cacdbf0189d

iv

b549f3bb806c4bce9c949f61185f2c38

303dc6e6

和(不是这样)对应的java代码


byte[] key = hexStringToByteArray("19900205760f9b9696b34cacdbf0189d");

byte[] iv = hexStringToByteArray("b549f3bb806c4bce9c949f61185f2c38");

byte[] payload = new byte[] { 1, 2, 3, 4};


AESEngine aesEngine = new AESEngine();

CFBBlockCipher cipher = new CFBBlockCipher(aesEngine, 8);

ParametersWithIV params = new ParametersWithIV(new KeyParameter(key), iv);


BufferedBlockCipher bbc = new BufferedBlockCipher(cipher);

bbc.init(true, params);


byte[] output = new byte[payload.length];

int result = bbc.processBytes(payload, 0, payload.length, output, 0);

bbc.doFinal(output, result);


System.out.println("With BC: " + bytesToHex(output));

java的结果是


305F1C09

对于任何有效负载,第一个字节始终与两种实现相同,但其余部分则有所不同。可能是密码反馈循环的工作方式不同吗?


编辑:正如詹姆斯在评论中指出的,这是块大小的问题。在上面的代码中,ruby 似乎使用默认的 128 位块大小,而 java 代码使用 8 位块。在我的情况下,我必须将 ruby 代码与 java 匹配,所以我现在需要找到一种方法来使用 8 位块大小和 ruby。


我很干。这里有什么想法吗?


陪伴而非守候
浏览 251回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java