【问题标题】:AES 128 CFB, Java/BouncyCastle vs Ruby/OpenSSLAES 128 CFB、Java/BouncyCastle 与 Ruby/OpenSSL
【发布时间】:2019-02-15 02:20:32
【问题描述】:

我正在尝试将 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

对于任何有效负载,第一个字节总是与两种实现相同,但其余的则不同。会不会是密码反馈循环的工作方式不一样?

编辑:正如 James 在 cmets 中指出的那样,这是块大小的问题。在上面的代码中,ruby 似乎使用默认的 128 位块大小,而 java 代码使用 8 位块。就我而言,我必须将 ruby​​ 代码与 java 匹配,所以我现在需要找到一种方法来使用 ruby​​ 的 8 位块大小。

我很干。有什么想法吗?

【问题讨论】:

  • CFB 模式有一个附加参数,反馈大小。从 Java 代码中可以清楚地看出,您在那里选择了 8 位反馈模式。在 Ruby 代码中,您显然获得了默认反馈大小,我猜是 128。
  • 你完全正确!当我为 java 使用 128 的块大小时,我得到了相同的结果。干杯!现在不幸的是我无法修改java实现,我必须将它与ruby匹配。到目前为止,我还没有找到改变 Ruby 块大小的方法......我会继续寻找,但欢迎任何提示!

标签: java ruby encryption aes bouncycastle


【解决方案1】:

正如 James 所指出的,ruby 上的块大小是错误的。我应该为 CFB 使用 8 位块大小,而是使用默认的 128 位。

这解决了它:

cipher = OpenSSL::Cipher.new("AES-128-CFB8")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多