附 :近日的项目是与其他公司进行合作开发的,在传输密码时对方提出用3DES加密方式进行加密。对方提供了BASE64编码的key和向量IV,其使用的是C#语言,在进行3DES加密时使用的是CBC模式,Zeros填充方式。而我方使用的是java语言。
在Google一番后发现,两种语言之间有两种兼容方式:
1.C#采用CBC Mode,PKCS7 Padding,Java采用CBC Mode,PKCS5Padding Padding
2.C#采用ECB Mode,PKCS7 Padding,Java采用ECB Mode,PKCS5Padding Padding
但是在此次合作中,C#的填充方式为Zeros、CBC模式,使我很苦恼。在大量的Google之后,找到了解决方案,因此进行记录。
在java中用CBC模式,NoPadding填充方式。在进行加密时自己完成对密码的填充(用字节零填充)可以保证与C#中CBC模式Zeros填充方式加密结果相同。
代码:
import java.io.UnsupportedEncodingException;
import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import org.apache.commons.codec.binary.Base64;
/**
* 加密方法DESede表示是3des加密方式<p>
* 运算模式CBC,ECB。在CBC模式下使用key,向量iv;在ECB模式下仅使用key。<p>
* 填充模式NoPadding、PKCS5Padding、SSL3Padding。<p>
* 语言之间的兼容:<br>
* 一个是C#采用CBC Mode,PKCS7 Padding,Java采用CBC Mode,PKCS5Padding Padding,<br>
* 另一个是C#采用ECB Mode,PKCS7 Padding,Java采用ECB Mode,PKCS5Padding Padding,
* <p>
* 此段代码使用的CBC模式NoPadding填充方式、用字节零填充,目的是匹配C#语言中CBC模式,zeros填充方式。
*/
public class ThreeDES {
/**
* 加密BASE64编码的KEY
*/
private static final String BASE64_key = "12345678901234567890123456789012";
/**
* 向量IV
*/
private static final String _IV = "12345678";
private final static String Algorithm = "DESede/CBC/NoPadding";//加密方法/运算模式/填充模式
/* 加密方法DESede表示是3des加密方式
* 运算模式CBC,ECB。在CBC模式下使用key,向量iv;在ECB模式下仅使用key。
* 填充模式NoPadding、PKCS5Padding、SSL3Padding。
* 语言之间的兼容:
* 一个是C#采用CBC Mode,PKCS7 Padding,Java采用CBC Mode,PKCS5Padding Padding,
* 另一个是C#采用ECB Mode,PKCS7 Padding,Java采用ECB Mode,PKCS5Padding Padding,
*/
private static SecureRandom sr = new SecureRandom();
private static SecretKeyFactory keyFactory;
private static DESedeKeySpec dks;
private static SecretKey securekey;
private static IvParameterSpec ips;
static {
//添加jce支持(sun有其默认实现)
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
try {
dks = new DESedeKeySpec(Base64.decodeBase64(BASE64_key.getBytes("UTF-8")));
keyFactory = SecretKeyFactory.getInstance("DESede");
securekey = keyFactory.generateSecret(dks);
ips = new IvParameterSpec(_IV.getBytes("UTF-8"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 3des加密
* @param password 密码
* @return 加密后密文
*/
public static String encrypt(String password){
Cipher cipher;
String result = null;
try {
cipher = Cipher.getInstance(Algorithm);
cipher.init(Cipher.ENCRYPT_MODE, securekey, ips, sr);
byte [] arry = cipher.doFinal(FormateData(password));
result = new String(Base64.encodeBase64(arry),"UTF-8");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
/**
* 3des解密
* @param password 密文
* @return 解密后密码
*/
public static String decrypt(String password){
Cipher cipher;
String result = null;
try {
cipher = Cipher.getInstance(Algorithm);
cipher.init(Cipher.DECRYPT_MODE, securekey, ips, sr);
byte [] arry = cipher.doFinal(Base64.decodeBase64(password.getBytes("UTF-8")));
result = new String(FormateByte(arry));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
/**
* 密码加密时,填充字符串为8的倍数。<p>
* (此方法在模式是CBC模式,填充方式为NoPadding方式的情况下,用字节零填充.)
*
* @param str
* 密码
* @return 加密后的密文
*/
public static byte [] FormateData(String str) throws UnsupportedEncodingException{
int yu = str.length() % 8;
if(yu != 0){
int size = 8 - yu;
byte [] arr = new byte [str.length() + size];
byte [] data = str.getBytes("UTF-8");
int i = 0;
for (; i < data.length; i++) {
arr[i] = data[i];
}
for (int j = 0; j < size; j++,i++) {
arr[i] = new byte [] {0}[0];
}
return arr;
}
return str.getBytes("UTF-8");
}
/**
* 密码解密时,将填充的字节零去掉!<p>
* (此方法只在模式是CBC模式,填充方式为NoPadding方式,用字节零填充 的情况下使用。)
* @param arr
* 密文字节组
*
* @return 密码字节组
*/
public static byte [] FormateByte(byte [] arr){
int i = 0;
for (; i < arr.length; i++) {
if(arr[i] == new Byte("0")){
break;
}
}
byte [] result = new byte [i];
for (int j = 0; j < i; j++) {
result[j] = arr[j];
}
return result;
}
public static void main(String[] args) {
String a = encrypt("12345612345612345");
System.out.println(a);
System.out.println(decrypt(a));
}
}
分享到:
相关推荐
本DEMO提供了C#和JAVA两种编程语言下的DES加密和解密实现,这对于理解DES算法及其在实际开发中的应用非常有帮助。 1. **DES算法原理** - **结构**:DES算法基于Feistel网络,它将明文分为左右两半,通过一系列的...
标题中的“java和C#通用des3加解密”指的是在Java和C#这两种不同的编程语言中实现DES(Data Encryption ...通过理解这些知识点,开发者可以在Java和C#之间实现3DES的兼容加密,确保数据在不同系统间的无缝安全交换。
PHP 3des 对称加密解密,与 java c#兼容
标题“Java和C#通过DES加密得到相同数据”所涉及的知识点主要集中在数据加密领域,特别是使用DES(Data Encryption Standard)算法在不同的编程语言中实现兼容的加密过程。DES是一种广泛应用的对称加密算法,其核心...
标题中的“DES加密JAVA与C#交互绝对可用”意味着我们将探讨如何在Java和C#之间使用DES(Data Encryption Standard)加密算法进行数据安全传输。DES是一种广泛应用的块密码,使用56位密钥对64位的数据块进行加密。...
在提供的"Java、C#与PHP的DES加密互通代码(测试通过).txt"文件中,应该包含了示例代码和测试用例,演示了如何在这些环境中正确地进行DES加密并验证互通性。 总的来说,实现Java、C#和PHP之间的DES加密互通涉及...
在本文中,我们将探讨如何在C#和Java之间实现通用的DES加密和解密。C#和Java都提供了对DES算法的支持,但它们的实现略有不同。下面我们将详细解释C#和Java中的DES加密过程,并展示如何创建可互操作的加密类。 首先...
综上所述,这个C#项目旨在提供一个与Java平台兼容的RSA加密解密工具,方便跨平台的数据安全传输。开发人员可以利用这个工具包,使用C#进行RSA操作,同时处理来自Java环境的公钥和私钥。这在多语言协作或者混合系统...
在描述中提到的“可以与C#和Java互通”,意味着实现的3DES-ECB加密代码在C/C++环境下编译运行后,其加密结果应该与C#和Java平台上的3DES-ECB加密算法得到的结果一致。这通常需要确保所有平台都遵循相同的密钥、初始...
本资源提供的是一套完整的JavaScript实现,能够与ASP.NET和JAVA平台的3DES加密解密及Base64编码解码功能保持兼容。 首先,3DES的工作原理是在DES的基础上增加了一次加密过程,即使用同一个密钥进行三次加密,这大大...
总结,Java和C#之间使用DES加密解密涉及密钥生成、数据分块、加密解密过程以及编码解码等步骤。为了实现跨平台的兼容性,必须确保所有参数和设置的一致性,包括密钥、IV、填充方式以及加密模式。在实际应用中,还...
总之,理解和实现Java与C#之间的DES加密解密代码是跨平台数据安全的关键步骤。确保一致性、正确处理边界条件和异常,以及选择适当的加密模式和密钥管理策略,都是实现这一目标的关键因素。同时,随着技术的发展,...
总的来说,PBEWithMD5AndDES在Java和C#中都是为了保护数据安全,通过用户提供的密码生成加密密钥,同时结合MD5哈希和DES加密算法。尽管MD5在当今被认为是不安全的,但它在PBE中仍被广泛使用,主要是因为兼容性和历史...
本文将深入探讨Android端与C#端的DES加密解密实现,以及如何确保它们之间的兼容性。 首先,DES是一种块加密算法,使用64位的数据块和56位的密钥进行操作。它的加密过程分为一系列的替换和转换步骤,通过这些步骤将...
在这个主题中,我们将探讨PHP、JAVA、C#、Object-C和Android这五种编程语言中如何实现DES加密解密。 1. PHP DES加密解密: 在PHP中,可以使用mcrypt扩展来实现DES加密解密。首先,你需要创建一个密钥和初始化向量...
最近做一个接口,与JAVA的关于DES/CBC/PKCS5Padding 互相解密。在网上找了很多资料,摸索了3天才摸索出来。同样的明文,用JAVA加密的密文死活都跟用DELPHI加密的不相等,有时候少于8个字符的就正常,多了8个字符的就...
3. **Objective-C实现DES加密**: - 在Objective-C中,可以使用CommonCrypto库进行DES加密。需要导入`<CommonCrypto/CommonCryptor.h>`头文件,然后使用`CCCrypt`函数进行加密和解密。同样需要先生成密钥,然后设置...
JavaScript实现的DES CBC加密算法可以与后端的Java或.NET环境下的DES加密算法兼容,这是因为它们遵循了相同的加密标准和模式。在JavaScript中,可以使用开源库如crypto-js来实现DES CBC加密。这个库提供了加密和解密...