加密的问题(JAVA可逆) 明文:长度小于50位; 密文:要限制在20-25位; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 des 明文为8的倍数不行呀,我测过。“ringobob”能否发点代码?谢谢了!!!! 用DES或者AES就可以了,Java都内置了支持//生成一个key,只应该生成一次。SecretKey key = KeyGenerator.getInstance("DES").generateKey();Cipher cipher = Cipher.getInstance("DES");cipher.init(Cipher.ENCRYPT_MODE, key);byte[] src = ...;//注意,encrypt不能直接new String,//如需要变成可见字符可用new sun.misc.BASE64Encoder().encode(encrypt)byte[] encrypt = cipher.doFinal(src);//这里是保存key的方法,应该通过保存keyCode来使用同一个keybyte[] keyCode = key.getEncoded();key = new SecretKeySpec(keyCode, "DES"); cipher.init(Cipher.DECRYPT_MODE, key);src = cipher.doFinal(encrypt); byte[] src = "ringobob".getBytes();System.out.println(new String(src));这样也不会错的同样可以得到 "ringobob" "ChDw" 能否把代码发给我, 还有“密钥和明文分别给多少位”,明文和密文就一样长了?谢谢你!!!! 这个项目非常急,"ChDw",我还在没时间研究。完了后,我向您请教!!! 上面的代码就已经足够了吧,生成密钥、加密、保存密钥、还原密钥、解密都有啊密文其实会比明文长一点点,DES是8位分组的。也就是如果数据不足8位补足8位,刚才8位就再补8位即50位明文加密后会被成56位,如果是56位会变成64位 如果一定要等长,我就只会简单的移位和交换了移位就是每若干个字节为一组,通过固定算法交换相互之间的位置交换就是定义一个加密数组和相应的解密数组,然后遍历原始数组的每一个字节,然后用加密数组中相应位置的字节替换,解密时相反,即byte[] b = {...} //其实就是由-128~127这256个字节的打乱顺序生成for(int i = 0; i < src.length; i++) src[i] = b[src[i]]; ChDw,能否给你现成的,大虾们不要骂我,我很好学,可不过我的项目急!!!!! 这个其实不复杂,简单的数组操作罢了。不过其实一般对长度没有这么严格要求吧,连长一点点都不能接受吗?DES、AES的安全性要高一些的 byte[] encryptArray = new byte[256]; byte[] decryptArray = new byte[256]; for(int i = 0; i < encryptArray.length; i++) encryptArray[i] = (byte) i; Random r = new Random(); for (int i = encryptArray.length; i > 1; i--) { int index = r.nextInt(i); byte t = encryptArray[i - 1]; encryptArray[i - 1] = encryptArray[index]; encryptArray[index] = t; decryptArray[encryptArray[i - 1] & 0xFF] = (byte) (i - 1); } byte[] src = "abc27".getBytes(); byte[] encrypt = new byte[src.length]; for(int i = 0; i < src.length; i++) encrypt[i] = encryptArray[src[i] & 0xFF]; //2位之间交换,加密 for(int i = 1; i < encrypt.length; i += 2) { byte t = encrypt[i]; encrypt[i] = encrypt[i - 1]; encrypt[i - 1] = t; } // //2位之间交换,解密 for(int i = 1; i < encrypt.length; i += 2) { byte t = encrypt[i]; encrypt[i] = encrypt[i - 1]; encrypt[i - 1] = t; } // for(int i = 0; i < encrypt.length; i++) src[i] = decryptArray[encrypt[i] & 0xFF]; System.out.println(new String(src)); ChDw,上面的代码的密文能不能只是“数字和字母”? 那就自己改啦,什么我都帮你做好。你是不是给我发钱其实就是上面那个数组只初始化26 + 26 + 10,然后在现在的循环中下标修正一下就行了,例如encrypt[i] = encryptArray[src[i] & 0xFF];改成if(src[i] >= 'A' && src[i] <= 'Z') encrypt[i] = encryptArray[src[i] - 'A'];else if(src[i] >= 'a' && src[i] <= 'z') encrypt[i] = encryptArray[src[i] - 'a' + 26];else if(src[i] >= '0' && src[i] <= '9') encrypt[i] = encryptArray[src[i] - '0' + 26 + 26];类似于这样 ChDw,我的项目主要是“长途车站”用,所以最好是密文是“数字和字母” DES、AES 是对称加密算法中的块加密,原文或者填充后的原文必须得是 8 的整数位若想跟原文长度一样的话,只能使用对称加密算法中的流加密,在 JAVA 中有 RC4 的实现。 火龙哥果然diao 佩服,追赶 ChDw哥,#28你说的调了一下,密文只能是数字。如果加上字符的话,就解不了密。请您帮忙再调查一下!谢谢您!!!! 大家都来晒下常用API和各自收集信息的方式 NetBeans建立项目后生成三个java文件aboutbox app view…… swt browser 怎样屏蔽鼠标右键? 用数组模拟链表 解释一段程序 请问各位高手:编码为"B5 C8 30 41 BF BC 8C 9A",问这串编码中包含有( )个汉字? 关于JAVA帮助文档问题 高手们能否在下面的每一句后面注释下她的功能???我看的不是很明白? 读Excel文件 java发布桌面软件,我应该如何去做 求解这个简单的程序 Toolkit.getImage()方法的使用 来高手帮我看下这个题目吧!
//生成一个key,只应该生成一次。
SecretKey key = KeyGenerator.getInstance("DES").generateKey();
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] src = ...;
//注意,encrypt不能直接new String,
//如需要变成可见字符可用new sun.misc.BASE64Encoder().encode(encrypt)
byte[] encrypt = cipher.doFinal(src);//这里是保存key的方法,应该通过保存keyCode来使用同一个key
byte[] keyCode = key.getEncoded();
key = new SecretKeySpec(keyCode, "DES");
cipher.init(Cipher.DECRYPT_MODE, key);
src = cipher.doFinal(encrypt);
System.out.println(new String(src));
这样也不会错的
同样可以得到 "ringobob"
密文其实会比明文长一点点,DES是8位分组的。也就是如果数据不足8位补足8位,刚才8位就再补8位即50位明文加密后会被成56位,如果是56位会变成64位
交换就是定义一个加密数组和相应的解密数组,然后遍历原始数组的每一个字节,然后用加密数组中相应位置的字节替换,解密时相反,即
byte[] b = {...} //其实就是由-128~127这256个字节的打乱顺序生成for(int i = 0; i < src.length; i++)
src[i] = b[src[i]];
byte[] decryptArray = new byte[256];
for(int i = 0; i < encryptArray.length; i++)
encryptArray[i] = (byte) i;
Random r = new Random();
for (int i = encryptArray.length; i > 1; i--) {
int index = r.nextInt(i);
byte t = encryptArray[i - 1];
encryptArray[i - 1] = encryptArray[index];
encryptArray[index] = t;
decryptArray[encryptArray[i - 1] & 0xFF] = (byte) (i - 1);
}
byte[] src = "abc27".getBytes();
byte[] encrypt = new byte[src.length];
for(int i = 0; i < src.length; i++)
encrypt[i] = encryptArray[src[i] & 0xFF];
//2位之间交换,加密
for(int i = 1; i < encrypt.length; i += 2) {
byte t = encrypt[i];
encrypt[i] = encrypt[i - 1];
encrypt[i - 1] = t;
}
// //2位之间交换,解密
for(int i = 1; i < encrypt.length; i += 2) {
byte t = encrypt[i];
encrypt[i] = encrypt[i - 1];
encrypt[i - 1] = t;
}
//
for(int i = 0; i < encrypt.length; i++)
src[i] = decryptArray[encrypt[i] & 0xFF];
System.out.println(new String(src));
然后在现在的循环中下标修正一下就行了,例如
encrypt[i] = encryptArray[src[i] & 0xFF];
改成
if(src[i] >= 'A' && src[i] <= 'Z')
encrypt[i] = encryptArray[src[i] - 'A'];
else if(src[i] >= 'a' && src[i] <= 'z')
encrypt[i] = encryptArray[src[i] - 'a' + 26];
else if(src[i] >= '0' && src[i] <= '9')
encrypt[i] = encryptArray[src[i] - '0' + 26 + 26];
类似于这样