Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AES 128 CFB,Java/BouncyCastle vs Ruby/OpenSSL_Java_Ruby_Encryption_Aes_Bouncycastle - Fatal编程技术网

AES 128 CFB,Java/BouncyCastle vs Ruby/OpenSSL

AES 128 CFB,Java/BouncyCastle vs Ruby/OpenSSL,java,ruby,encryption,aes,bouncycastle,Java,Ruby,Encryption,Aes,Bouncycastle,我试图将BouncyCastle的java实现中的AES加密与Ruby进行匹配。不知何故,即使使用相同的键、IV和有效负载,我似乎也无法在两种语言中获得相同的结果 在这个例子中,我使用ruby生成key和IV,然后在java代码中重用这个key和IV 有人能看出哪里不对劲吗 以下是ruby代码: 需要“openssl” cipher=OpenSSL::cipher::AES.new(128,“CFB”) 加密 有效载荷=“\x01\x02\x03\x04”。b 放“钥匙” 放置密码。随机密钥。解

我试图将BouncyCastle的java实现中的AES加密与Ruby进行匹配。不知何故,即使使用相同的键、IV和有效负载,我似乎也无法在两种语言中获得相同的结果

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

有人能看出哪里不对劲吗

以下是ruby代码:

需要“openssl”
cipher=OpenSSL::cipher::AES.new(128,“CFB”)
加密
有效载荷=“\x01\x02\x03\x04”。b
放“钥匙”
放置密码。随机密钥。解包(“H*”)
“四”
puts cipher.random_iv.解包(“H*”)
puts(cipher.update(payload)+cipher.final).unpack(“H*”)
其输出:

key
19900205760f9b9696b34cacdbf0189d
iv
b549f3bb806c4bce9c949f61185f2c38
303dc6e6
以及(并非如此)相应的java代码

byte[]key=hexStringToByteArray(“19900205760f9b9696b34cacdbf0189d”);
字节[]iv=hexStringToByteArray(“b549f3bb806c4bce9c949f61185f2c38”);
字节[]有效载荷=新字节[]{1,2,3,4};
AESEngine AESEngine=新AESEngine();
CfBlockCipher cipher=新CfBlockCipher(aesEngine,8);
参数swithiv params=新参数swithiv(新键参数(键),iv);
BufferedBlockCipher bbc=新的BufferedBlockCipher(密码);
bbc.init(true,params);
字节[]输出=新字节[payload.length];
int result=bbc.processBytes(有效载荷,0,有效载荷.length,输出,0);
bbc.doFinal(输出、结果);
System.out.println(“带BC:+bytesToHex(输出));
java的结果是

305F1C09
对于任何有效负载,两种实现的第一个字节总是相同的,但其余的则不同。可能是密码反馈回路的工作方式不同吗

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


我干了。有什么想法吗?

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

这就解决了它:

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

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