首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AES 128 CFB,Java/BouncyCastle /OpenSSL

AES 128 CFB,Java/BouncyCastle /OpenSSL
EN

Stack Overflow用户
提问于 2018-09-10 15:43:08
回答 1查看 313关注 0票数 2

我正在尝试将BouncyCastle的java实现中的AES加密与Ruby相匹配。不知怎么的,即使使用相同的键,IV和有效载荷,我似乎也不能在两种语言中得到相同的结果。

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

有人能发现出什么问题了吗?

这是红宝石代码:

代码语言:javascript
复制
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*")

及其产出:

代码语言:javascript
复制
key
19900205760f9b9696b34cacdbf0189d
iv
b549f3bb806c4bce9c949f61185f2c38
303dc6e6

以及相应的java代码(不是这样)

代码语言:javascript
复制
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的结果是

代码语言:javascript
复制
305F1C09

对于任何有效负载,第一个字节总是与这两个实现相同,但其余的字节则不同。难道密码反馈回路的工作方式不一样吗?

编辑:正如James在评论中指出的,这是块大小的问题。在上面的代码中,ruby似乎使用128位块大小的默认值,而java代码使用8位块。在我的例子中,我必须将ruby代码与java相匹配,因此我现在需要找到一种方法,在ruby中使用8位块大小。

我是干的。这里有什么线索吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-11 08:00:03

所以正如詹姆斯所指出的,红宝石的块状尺寸是错误的。我应该使用8位块大小的CFB,但取而代之的是使用默认128位。

这解决了这个问题:

代码语言:javascript
复制
cipher = OpenSSL::Cipher.new("AES-128-CFB8")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52261338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档