明文是8个字节的,密文却变成16字节的?

代码间的舞者 2010-06-09 12:04:58
代码如下:
import java.io.UnsupportedEncodingException;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

public class DesDemo {
public static byte[] decryptByDES(byte[] bytE,byte[] bytKey) throws Exception{
DESKeySpec desKS = new DESKeySpec(bytKey);
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey sk = skf.generateSecret(desKS);
Cipher cip = Cipher.getInstance("DES");
IvParameterSpec iv = new IvParameterSpec(bytKey);
cip.init(Cipher.DECRYPT_MODE,sk,iv);
return cip.doFinal(bytE);
}

public static byte[] encryptByDES(byte[] bytP,byte[] bytKey) throws Exception{
DESKeySpec desKS = new DESKeySpec(bytKey);
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey sk = skf.generateSecret(desKS);
Cipher cip = Cipher.getInstance("DES/ECB/PKCS5Padding");
cip.init(Cipher.ENCRYPT_MODE,sk);
return cip.doFinal(bytP);
}

public static void main(String[] args) throws UnsupportedEncodingException, Exception {
byte[] data="12345678".getBytes("utf-8");
byte[] key="87654321".getBytes("utf-8");
byte[] Master_Text=DesDemo.encryptByDES(data, key);
System.out.println(Master_Text.length);
}
}

输入的结果是:16
...全文
352 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
代码间的舞者 2010-06-10
  • 打赏
  • 举报
回复
c的不清楚,说是不足8字节的后面补空格。而且明文是8字节,密文也是8字节的。

用java加密出来的字符串和c加密出来的字符串都一样,就是java后面多了8个填充的字符。请问下,有没有办法不让java增加这8个填充字符?
PS:java的加密模式是EBC,填充模式不允许用NoPadding。我试过用CBC/NoPadding,但是加密的结果不是想要的结果。

代码间的舞者 2010-06-10
  • 打赏
  • 举报
回复
我自己写了个DES类。问题总算解决了。呵呵
  • 打赏
  • 举报
回复
因为你用 PKCS5Padding 进行了填充。

根据填充的规范,只要设定了填充,就必须使用,因此哪怕是 8 个字节的整数倍也需要增加填充,否则就没办法解密了。

设定了填充模式,分组加密算法加密后的长度是:原文的字节数 / 8 * 8 + 8
龙四 2010-06-09
  • 打赏
  • 举报
回复
不行吗?!
龙四 2010-06-09
  • 打赏
  • 举报
回复
这有什么不可以的?!
diggywang 2010-06-09
  • 打赏
  • 举报
回复
用Base64,说不定就是12字节!
  • 打赏
  • 举报
回复
用 DES 加密的话,若不采用填充模式,那原文的字节数必须是 8 的整数倍。
  • 打赏
  • 举报
回复
C 语言上的 DES 是采用什么方式加密的?

需要知道加密模式(比如 ECB、CBC、OFB 等)和填充模式(NoPadding, PKCS5Padding, ISO10126Padding 等)这两个非常重要。
代码间的舞者 2010-06-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bao110908 的回复:]
因为你用 PKCS5Padding 进行了填充。

根据填充的规范,只要设定了填充,就必须使用,因此哪怕是 8 个字节的整数倍也需要增加填充,否则就没办法解密了。

设定了填充模式,分组加密算法加密后的长度是:原文的字节数 / 8 * 8 + 8
[/Quote]
明白了。谢谢。
我现在遇到的问题是:
c生成的密钥和密文,如何在java下解密?(c的密文只有8个字节)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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