`
flyboNew
  • 浏览: 18780 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

DES加密注意的地方

阅读更多
最近在调研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加密c语言实现

    在C语言中实现DES加密,需要理解DES算法的核心步骤,并将其转化为C语言代码。 DES算法主要分为以下几个步骤: 1. **初始置换(IP)**:将64位明文分成左右两半,每半32位,然后通过一个固定的置换表进行重新排列。...

    DES加密算法 C#.NET2008实现

    在C#.NET 2008中实现DES加密算法,你需要使用System.Security.Cryptography命名空间中的 DESCryptoServiceProvider 类。首先,你需要创建一个DESCryptoServiceProvider对象实例,然后设置密钥和初始化向量(IV)。...

    DES加密解密程序(JAVA)

    这个"DES加密解密程序(JAVA)"应该是一个Java实现的DESEncryption和DESDecryption类或者工具包,能够对普通文件进行加解密操作。下面我们将深入探讨DES加密算法以及在Java中的实现。 DES算法于1977年被美国国家标准...

    android上利用des加密程序

    本文将详细讲解如何在Android上实现DES加密,以及其背后的原理和注意事项。 首先,DES是一种对称加密算法,这意味着加密和解密使用的是同一把密钥。它基于64位的数据块进行操作,但实际有效数据只有56位,因为每7位...

    C#实现DES,RS2,3DES加密的类

    C#中可以使用`System.Security.Cryptography`命名空间中的`DESCryptoServiceProvider`类来实现DES加密。以下是一个简单的示例: ```csharp using System; using System.IO; using System.Security.Cryptography; ...

    JS前台加密,java后台解密实现

    2. **Java安全策略**:在Java中,需要注意JCE的默认密钥长度限制,对于更强大的加密,可能需要安装不受限制的政策文件。 3. **解密后的安全处理**:解密后的用户信息应存储在安全的地方,并遵循最小权限原则,确保...

    DESCryptoServiceProvider密码加密与解密

    `DESCryptoServiceProvider` 是 .NET Framework 提供的一个用于执行数据加密标准 (DES) 加密和解密操作的类。DES 是一种对称加密算法,意味着加密和解密使用相同的密钥。虽然 DES 在安全性方面已经被更先进的算法...

    des算法C语言实现版本

    // DES加密函数声明 DES_Block DES_Encrypt(DES_Block plaintext, DES_Key key); // DES解密函数声明 DES_Block DES_Decrypt(DES_Block ciphertext, DES_Key key); ``` `des.c` 文件则是实际实现DES算法的地方。DES...

    C#实现简单的3DES加密解密功能示例

    在C#中,3DES(Triple DES)是一种加强版的DES加密算法,它通过三次应用DES算法来提高安全性。3DES使用三个独立的56位密钥,每次加密时使用其中一个,总共进行三次加密,因此得名“三重”DES。这种加密方式使得3DES...

    DES DLL vs2008可直接调用命名空间

    在本主题中,“DES DLL vs2008可直接调用命名空间”指的是在Microsoft Visual Studio 2008 (VS2008)环境下,开发人员可以利用一个动态链接库(DLL)来实现DES加密和解密功能,并且这个DLL提供了可以直接在C#或Visual...

    DES.rar_visual c

    描述中提到"des加密的一个程序,应该能用,可能不太好",意味着这个程序是DEs加密功能的实现,可能已经完成了基本的功能,但可能存在一些问题或不完善的地方,比如性能、效率或者代码质量可能有待提高。对于初学者或...

    delphi实现文件加密解密

    - 安全存储:加密后的文件应保存在安全的地方,防止物理或逻辑上的泄露。 - 错误处理:在编码过程中要处理可能出现的错误,如文件不存在、密钥错误等。 通过以上步骤,开发者可以利用Delphi实现文件的加密解密,...

    C# 文件夹加密

    1. 加密算法:C#支持多种加密算法,如AES(高级加密标准)、RSA(公钥加密)、DES(数据加密标准)等。其中,AES是目前最常用的一种对称加密算法,适合大量数据的加密。 2. System.Security.Cryptography命名空间:...

    文件夹加密算法.rar

    对称加密是最古老的加密方式,如DES(Data Encryption Standard)和AES(Advanced Encryption Standard)。在这种方法中,加密和解密使用相同的密钥。优点是速度快,适合大量数据的加密,但缺点是密钥管理和分发...

    C# ASP.NET - 加密与解密数据库中字段数据

    一、DES加密算法基础 DES是一种古老的加密算法,它使用64位的密钥对数据进行加密,但实际上只有56位是真正参与加密过程的。DES分为两个阶段:加密和解密。加密过程将明文转换为密文,而解密过程则将密文还原为明文。...

    txt文档加密txt文档加密

    对称加密使用同一密钥进行加密和解密,如DES、AES等;非对称加密则使用一对公钥和私钥,如RSA。对称加密速度快,适合大量数据,而非对称加密安全性更高,但计算复杂度较高。 3. **软件工具**:许多软件可以对TXT...

    文件夹加密工具

    在信息安全领域,常见的加密算法有AES(高级加密标准)、DES(数据加密标准)以及RSA(公钥加密技术)。AES是一种广泛使用的对称加密算法,适合大量数据的快速加密;DES虽然较旧,但因其简单性仍有一定的应用;RSA则...

    C#文件加密实例源码2019

    这个命名空间提供了各种加密算法,如AES(高级加密标准)、DES(数据加密标准)、RSA(公钥加密算法)等。在C#文件加密实例中,通常会使用AES,因为它提供了更高的安全性和效率。 2. **AES 加密** AES(Advanced ...

    VB.NET2005开发的文本加密解密技术

    例如,System.Security.Cryptography.Aes类用于AES加密,System.Security.Cryptography.RSA类用于RSA加密,System.Security.Cryptography.DESCryptoServiceProvider类用于DES加密等。 三、动态密钥设定 动态密钥是...

Global site tag (gtag.js) - Google Analytics