在 JAVA 中,从 J2EE1.4 开始,SUN 提供了 JCE( JAVA CRYPTO ENGINE ),其中包含有 DES 算法,在 JAVA 中使用 DES 算法的代码示例如下:
Java Crypto Example
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
public class DESPlus
{
static String strDefaultKey = "initkey";
static Cipher encryptCipher = null;
static Cipher decryptCipher = null;
static String src="";
static {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
Key key = null;
try {
key = getKey(src.getBytes());
encryptCipher = Cipher.getInstance("DES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
decryptCipher = Cipher.getInstance("DES");
decryptCipher.init(Cipher.DECRYPT_MODE, key);
}catch(Exception e){
e.printStackTrace();
}
}
public DESPlus() throws Exception {
this(strDefaultKey);
}
public static byte[] encrypt(byte[] arrB) throws Exception {
return encryptCipher.doFinal(arrB);
}
public static byte[] decrypt(byte[] arrB) throws Exception {
return decryptCipher.doFinal(arrB);
}
private static Key getKey(byte[] arrBTmp) throws Exception {
byte[] arrB = new byte[8];
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
}
Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
return key;
}
}
需要注意的是,加密后的结果是字节数组,一般情况下可以使用 BASE64 进行编码,以方便存储在字符串形的数据库字段中,当然亦可以采用原始的字节流或者是十六进制编码字符串;同样需要注意的是,在上面的代码示例中,JAVA 的 DES 算法可以指定加密的模式和填充方式,如果不指定,则默认的就是 ECB 加密模式和 PKCS#5 填充方式,关于加密模式和填充方式之后将进行介绍,现在我们来看 OPENSLL 的 DES 算法,还是先给一段代码示例:
C++ Crypto Example
int Encrypt( unsigned char * inbuf , unsigned char * * outbuf , int inlen , unsigned char * key, unsigned char * iv )
{
BIO *bio, *mbio, *cbio;
unsigned char *dst;
int outlen;
mbio = BIO_new( BIO_s_mem( ) );
cbio = BIO_new( BIO_f_cipher( ) );
BIO_set_cipher( cbio , EVP_des_ecb( ) , key , iv , 1 );
bio = BIO_push( cbio , mbio );
BIO_write( bio , inbuf , inlen );
BIO_flush( bio );
outlen = BIO_get_mem_data( mbio , (unsigned char **) & dst );
* outbuf = ( unsigned char * ) malloc( outlen );
memcpy( * outbuf , dst , outlen );
BIO_free_all( bio );
return outlen;
}
该段代码使用了 OPENSSL 库,该函数返回加密结果的长度,同时将加密的结果放置在 outbuf 中,需要注意的是,BIO_set_chiper 这一行,最后两个参数:iv 参数在 ECB 加密模式下是不起作用的,仅 CBC 模式才会使用该变量,该变量要求必须是一个八字节的数组,enc 参数,如果是 1 则表明是进行加密,如果是 0 则表明是解密,-1 则表明使用最后一次操作的方式,只需要修改最后一个参数为0,就是解密了,所以解密的代码就不再重复了;
另外补充一点,这个加密方式是最古老的 DES ,不是 3DES ,输入参数 KEY 的长度要求至少是 8 个字节,如果不够,补 '\0',例如:unsigned char key[ ] = { "key\0\0\0\0\0" },如果超过八个字节,那么后面的不使用;如果你不愿意补零,那么需要保证和 JAVA 的对应,否则不能互相加解密;
哦,还有一点,请注意在使用完后释放 outbuf 内存块,保证没有内存泄露;
下面来说一下加密模式,常见的加密模式有 ECB / CBC / CFB / OFB 四种,这也是 OPENSSL 提供的四种,加密模式的主要意义就是,加密算法是按块进行加密的,例如 DES ,是 64Bit 一个块的进行加密,就是每次加密 8 个字节,因此每次输入八个字节的明文输出八个字节密文,如果是 16 个字节,那么分成两个块依次进行加密,问题就出现在这里,如果明文是 1234567812345678,分块分别进行加密,那么加密的结果类似“C4132737962C519C C4132737962C519C”,可以看出明文的规律,这就是 ECB 加密模式,密文可以看出明文的规律;为了解决这个问题,有了其他的加密模式:CBC 加密模式(密码分组连接),CFB加密模式(密码反馈模式),OFB加密模式(输出反馈模式)CBC 是要求给一个初始化的向量,然后将每个输出与该向量作运算,并将运算的结果作为下一个加密块的初始化向量,CFB 和 OFB 则不需要提供初始化向量,直接将密码或者输出作为初始化向量进行运算;这样就避免了明文的规律出现在密文中;当然缺点是解密时需要保证密文的正确性,如果网络传输时发生了一部分错误,则后面的解密结果就可能是错误的;(ECB模式仅影响传输错误的那个块);
密码算法基本上都是分组(按快)进行加密的,如果密文长度不是刚刚好可以进行分组,怎么办?只能进行填充,填充的方法有很多中,常用的是 PKCS#7,该填充方法是将每一个补充的字节内容填充为填充的字节个数;例如明文长度是 100 , 分组的大小是32个字节,那么需要分为四组,补充28个字节,那么补充的字节全部补充为'\0x28',如果分组的大小是 8 个字节,那么 PKCS#7 的填充方式和 PKCS#5 是完全一致的;另外还有一个规定,就是如果明文刚刚好进行分组,那么需要补充一个独立的分组出来,例如 DES ,如果明文为 8 个字节,那么需要补充为 16 个字节进行运算,这样的好处是进行解密后,将解密出来的最后一个字节取出来,并将解密结果的长度减去该值,就是原来明文的长度;
更多的信息可以参考:http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
分享到:
相关推荐
由于公司项目的需要想在JAVA加密文件、C++解密文件,因此去查阅了相关资料,后来就决定采用了DES加解密,但是在网上找了一些代码在JAVA上可以加密、在C++上就乱码了,骸···真是郁闷···因此就改了些代码代码...
总的来说,这个课程设计旨在让你掌握数据加密的基本原理,了解DES算法的运作方式,并在实际项目中运用Java实现加密解密功能。通过这样的实践,你不仅能提升编程技能,还能增强对数据安全的理解,这对任何IT专业人员...
在本项目中,"信息安全DES算法带界面实现"是一个实验性质的程序,它提供了用户友好的图形界面,使得用户可以直观地进行DES算法的操作,并进行不同进制之间的转换。 DES算法由IBM公司于1970年代初期设计,1977年被...
在这个“DES加解密算法源代码,java”项目中,开发者通过自定义的Java代码实现了DES算法,而非直接使用Java的javax.crypto包中的预封装类。这种实现方式有助于深入理解DES的工作机制,包括初始置换、轮函数、逆初始...
RSA 算法与 DES 算法的实现 RSA 算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对 RSA 密钥,其中之一是保密密钥,由用户保存;...
本资源包“java 加密解密 软件 c c++ 纯净版”提供了一套与编程语言Java、C和C++相关的加密解密工具和教程,适合进行VC(Visual C++)课程设计。 1. **Java加密解密**:Java提供了丰富的库,如Java Cryptography ...
总的来说,通过Java调用DLL实现DES加密解密涉及了Java和C/C++的混合编程,需要理解JNI的工作原理,以及如何在C/C++中与DLL交互。这个过程对于那些希望在Java中利用已有的本地库功能的开发者来说是至关重要的。
本文将深入探讨在C++和Java编程语言中实现的各种加密算法,以及如何在实际项目中应用这些技术。 首先,让我们从基础开始。加密是将可读信息(明文)转化为不可读形式(密文)的过程,目的是防止未经授权的访问或...
这个压缩包文件提供了关于DES加解密算法的C源码,这意味着我们可以看到如何在C语言环境下实现DES算法的详细过程。C++6.0编译通过表示这段代码已经在那个版本的编译器下成功编译并运行,这对于理解和复现算法很有帮助...
总的来说,这个压缩包提供了一套完整的工具,包括使用DES算法的Java程序和可能的C++实现,以及必要的依赖库和配置文件,用于对文件进行加密和解密操作。用户可以通过运行批处理文件来执行这些操作,确保他们的数据在...
标题中的“基于C++的3des代码”指的是在C++编程语言中实现的三重数据加密标准(3DES,Triple DES)算法。3DES是一种增强型的DES加密算法,它通过将DES加密过程重复三次来提高安全性。描述中提到的“注释详细,易于...
5. **源码实现**:在实际编程中,可以使用各种编程语言(如Java、Python、C++等)实现DES加解密功能。通常需要导入相关的加密库,例如Java的JCE(Java Cryptography Extension)或Python的pyDes库。源码通常包括密钥...
Java部分使用了JDK自带的SunJCE加密框架,一般网上可以找到的Java加密解密都是使用SunJCE框架,还有一个比较著名的 Java开源加密工具是bouncycastle(http://www.bouncycastle.org/),因为SunJCE是JDK自带的,所以...
2. **编写程序代码**:使用如C/C++、Java或Python等编程语言,根据算法描述编写实现DES加密与解密的程序代码。 3. **测试与验证**:通过输入已知明文和密钥,测试加密和解密功能是否正确无误。可采用标准的测试向量...
1. **理解DES算法原理**:深入学习DES的结构和操作,包括Feistel网络、置换和S盒等核心概念。 2. **编程实现**:使用编程语言(如C++、Java或Python)编写DES加密和解密函数,处理数据的输入输出、位操作和数组操作...
`JNI`(Java Native Interface)允许我们使用C++等原生代码来实现高性能和安全的加解密操作。本资源提供了在Android Studio项目中使用JNI实现RSA、DES、AES以及Base64和MD5的示例。 1. **RSA**: RSA是一种非对称...
1. **源码**:源代码通常会用C、C++、Java、Python等编程语言实现DES加密和解密的算法。开发者可以借此理解DES的工作原理,学习如何在实际项目中应用。源码可能包括函数或类,用于设置密钥、执行加密和解密操作,并...
在描述中提到了"在VC/C/C++/Java环境中实现DES算法",这意味着文件可能包含了在Visual C++环境下使用C或C++编写的代码示例,也可能有Java代码示例。这些示例可能覆盖了以下知识点: 1. **DES加密流程**:包括初始...
在描述中提到的“可以与C#和Java互通”,意味着实现的3DES-ECB加密代码在C/C++环境下编译运行后,其加密结果应该与C#和Java平台上的3DES-ECB加密算法得到的结果一致。这通常需要确保所有平台都遵循相同的密钥、初始...
C++以其高效性和灵活性被选择用于实现BM算法和DES加密,而Java由于其跨平台的特性以及丰富的安全库,成为实现DSA签名的理想选择。在提供的压缩包文件中,可能包含了这三个算法的C++和Java源代码实现,这对于学习和...