最近在调研DES算法的时候,遇到了一个问题,最后终于发现……
Base64的加密与解密java代码
[code="java"]package com.secure.test;
import java.io.IOException;
import org.junit.Test;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class MyTest {
/**
* base64解密
* @param key
* @return
* @throws IOException
*/
public static byte[] decryptBase64(String key) throws IOException {
return (new BASE64Decoder()).decodeBuffer(key);
}
/**
* base64加密
* @param key
* @return
*/
public static String encryptBase64(byte[] key){
return (new BASE64Encoder()).encodeBuffer(key);
}
}
}
Des加密与解密的java代码
[code="java"]package com.secure.test;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.junit.Test;
public class DesTest {
public static final String ALGORITHM = "DES";
/**
* 转换密钥
* @param key 初始化一个密钥
* @return 密钥
* @throws Exception
*/
private static Key tokey(byte[] key) throws Exception{
DESKeySpec spec = new DESKeySpec(key);
SecretKeyFactory factory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey secretkey = factory.generateSecret(spec);
return secretkey;
}
/**
* 用于解密操作
* @param date 用于解密的数据
* @param key 约定的密钥
* @return 返回一个解密过后的byte数组
* @throws Exception
*/
public static byte[] decrypt(byte[] date,String key) throws Exception{
Key dKey = tokey(Base64Test.decryptBase64(key));
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, dKey);
return cipher.doFinal(date);
}
/**
* 用于加密操作
* @param date 用于加密操作的数据
* @param key 约定的密钥
* @return 返回一个加密过后的byte数组
* @throws Exception
*/
public static byte[] encrpty(byte[] date,String key) throws Exception{
Key dKey = tokey(Base64Test.decryptBase64(key));
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, dKey);
return cipher.doFinal(date);
}
/**
* 用于产生密钥
* @param seed
* @return
* @throws Exception
*/
public static String initKey(String seed) throws Exception{
SecureRandom random = null;
if(seed != null){
random = new SecureRandom(Base64Test.decryptBase64(seed));
}else{
random = new SecureRandom();
}
KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);
generator.init(random);
SecretKey secretKey = generator.generateKey();
return Base64Test.encryptBase64(secretKey.getEncoded());
}
/**
* 重载的方法
* @return
* @throws Exception
*/
public static String initKey() throws Exception{
return initKey(null);
}
}
然后这里有一个测试的方法
[code="java"]@Test
public void testTwo() throws Exception{
String text = "Test";
System.out.println("原始文字:"+text);
String secretKey = DesTest.initKey("DES").trim();
System.out.println("密钥为:"+secretKey);
byte[] sDate = DesTest.encrpty(text.getBytes(), secretKey);
String eStr = new String(sDate);
System.out.println("加密后:"+eStr);
byte[] dDate = eStr.getBytes();
byte[] cDate = DesTest.decrypt(dDate, secretKey);
String dStr = new String(cDate);
System.out.println("解密后:"+dStr);
}
测试之后报错
[code="java"]javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
at com.sun.crypto.provider.SunJCE_h.b(DashoA12275)
at com.sun.crypto.provider.SunJCE_h.b(DashoA12275)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DashoA12275)
at javax.crypto.Cipher.doFinal(DashoA12275)
at com.secure.test.DesTest.decrypt(DesTest.java:40)
at com.secure.test.DesTest.testTwo(DesTest.java:110)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:592)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
原因是因为
[code="java"]byte[] sDate = DesTest.encrpty(text.getBytes(), secretKey);
这是一个经过加密之后的byte数组,然后在经过
[code="java"]String eStr = new String(sDate);
byte[] dDate = eStr.getBytes();
之后,其数组内容已经被改变了,所以存在问题。
分享到:
相关推荐
DES,DES加密算法,DES算法源码。用C写的DES加密算法。 DES,DES加密算法,DES算法源码。 DES加密算法(c语言实现) (本程序可以直接使用)
DES加密算法实现的C++类DES加密算法实现的C++类
一个调用动态链接库的des加密解密例子。
对数据进行3DES加密或者解密,如果密码长度为8字节则为DES加密或者解密
易语言文本DES加密源码。@资源源码站。
STM32上实现D3DES加密
对数据进行单DES或者3DES加密或者解密,如果密码长度为8字节则为DES加密或者解密
des加密解密工具
DES加密DES加密DES加密DES加密
主要介绍了使用java自带des加密算法实现文件加密和字符串加密的示例,需要的朋友可以参考下
采用c#, 在sql server 中调用des 加密, 解密字符串. 可自定义key
对称密码算法是指加密系统的加密密钥和解密密钥相同,或者虽然不同,但是可以从其中任意一个推导出另一个,更形象的说就是用同一把钥匙开锁和解锁。在对称密码算法的发展历史中曾出现过多种优秀的算法,包括DES、3...
DES 加密,RSA 加密,DES 文件加密,提供了方便文件加密接口
DES加密解密过程,C++实现
DES加密解密程序的C源码.喜欢就下~~~
delphi des 加密
VB实现DES加密解密算法已测试通过如有更新另行发布
DES加密 解密 方法: DESr DESw 支持3DES加密 解密 类中利用函数重载的方式 实现两种加密方式 加密后为16进制字符串 使用方法: 实例化一个对象 然后就可以随便用了。 如 DES加密 解密 CString sd,sd2; yxyDES2 ...
3DES加密解密的全工具类,快速帮助新人进行3Des加密解密
DES文件加密传输 通过把数据进行MD5加密,加密后的MD5码再进行DES数据加密,然后通过文件结构信息把加密后的DES信息进行传输,在接收端把获得的文件再进行加密然后与文件结构信息的加密码进行比对。