关于,求 3DES 加密

wcwtitxu 2011-07-28 09:54:39
       $td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $bytesKey, $iv);
$encryptedData = mcrypt_generic($td, $bytesInput);


上面是 php 代码


求高手翻译成 java

, 下面的代码,加密结果不一样

Key key = new SecretKeySpec(bytesKey, "TripleDES");
Cipher cipher = Cipher.getInstance("TripleDES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedData = cipher.doFinal(bytesInput);
...全文
178 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wcwtitxu 2011-07-29
  • 打赏
  • 举报
回复
老大,还有一帖

快去抢分

http://topic.csdn.net/u/20110728/21/b10c3ebd-1059-4890-8887-c7cf27e130de.html
  • 打赏
  • 举报
回复
你得用 DESede/ECB/NoPadding 进行处理。

YWJj 转成字节后将其用 00 填充至 8 个字节的倍数

wcwtitxu 2011-07-28
  • 打赏
  • 举报
回复
多谢楼上的热心网友,问题发现了。

php 不是使用 pkcs5Padding

php 是使用 zerosPadding


修改 java 代码:


public static byte[] zerosPadding(byte[] bytes) {
byte[] result = new byte[((bytes.length+7)/ 8) * 8];
System.arraycopy(bytes, 0, result, 0, bytes.length);
return result;
}

public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, ShortBufferException, InvalidAlgorithmParameterException, UnsupportedEncodingException {
byte[] s = zerosPadding("YWJjYWJjxxxxxxxx".getBytes());
byte[] k = "d67d8ab4f4c10bf22aa353e2".getBytes();
Key skey = new SecretKeySpec(k, "DESede");
Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, skey);
byte encryptedData[] = cipher.doFinal(s);
System.out.println(Base64.encrypt(encryptedData));
System.out.println(hex(encryptedData));
}

测试通过
阳明 to life 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wcwtitxu 的回复:]

php 中, mcrypt_create_iv 每次都产生不一样的 iv

但,不会影响结果
[/Quote]
因为你使用的ECB IV没起到作用

你最好还是对比下传进去的byte
阳明 to life 2011-07-28
  • 打赏
  • 举报
回复
Php中你能否把key和明文的byte全部打印
我记得java里面getBytes获取要指定编码什么的,要不然获取的二进制可能和其他的有点不同
wcwtitxu 2011-07-28
  • 打赏
  • 举报
回复
php 中, mcrypt_create_iv 每次都产生不一样的 iv

但,不会影响结果
wcwtitxu 2011-07-28
  • 打赏
  • 举报
回复

$input = "YWJj";
echo $input . "<br />";
$key = "d67d8ab4f4c10bf22aa353e2";
echo $key . "<br/>";
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$encrypted_data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo trim(base64_encode($encrypted_data)) . "<br />";
echo trim(strToHex($encrypted_data));

php 结果:
FBmhS3+MgJg=
1419A14B7F8C8098



byte[] s = "YWJj".getBytes();
byte[] k = "d67d8ab4f4c10bf22aa353e2".getBytes();
Key skey = new SecretKeySpec(k, "DESede");
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skey);
byte encryptedData[] = cipher.doFinal(s);
System.out.println(Base64.encrypt(encryptedData));
System.out.println(hex(encryptedData));


java 结果
bZ5coCKkuqc=
6d9e5ca022a4baa7
  • 打赏
  • 举报
回复
把 PHP 测试数据贴上来

1:所有原文 16 进制字节
2:8 个字节的初始化向量 16 进制
3:24 个字节的密钥 16 进制
4:加密后密文的 16 进制字节
阳明 to life 2011-07-28
  • 打赏
  • 举报
回复
还有明文是否一致。。。。
输出的二进制数组对比每一字节是从头到尾都不一样?还是说有一部分一样
阳明 to life 2011-07-28
  • 打赏
  • 举报
回复
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
噢 第一句话声明了是ecb。。。不会PHP
话说如果是ecb的 那就只用保证算法一致和密钥一致就行了
设置了都是3DES,然后密钥是否一致?
wcwtitxu 2011-07-28
  • 打赏
  • 举报
回复
俺发现 php 中,改变 iv 的值,但最终加密结果一样
阳明 to life 2011-07-28
  • 打赏
  • 举报
回复
http://weavesky.com/2008/01/05/java-3des/
看看这个吧,好久没写这个了,都忘了
阳明 to life 2011-07-28
  • 打赏
  • 举报
回复
Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
wcwtitxu 2011-07-28
  • 打赏
  • 举报
回复
真不懂这个,楼上的能不能帮忙给点代码
阳明 to life 2011-07-28
  • 打赏
  • 举报
回复
mcrypt_generic_init($td, $bytesKey, $iv);
看这句话 带IV向量的CBC模式
你写的JAVA是ECB的不带IV

51,396

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧