当前位置:首页 » 操作系统 » java3des源码

java3des源码

发布时间: 2023-05-04 10:24:10

‘壹’ java 进行3DES 加密解密

【Java使用3DES加密解密的流程】

①传入共同约定的密钥(keyBytes)以及算法(Algorithm),来构建SecretKey密钥对象

SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);

②根据算法实例化Cipher对象。它负责加密/解密

Cipher c1 = Cipher.getInstance(Algorithm);

③传入加密/解密模式以及SecretKey密钥对象,实例化Cipher对象

c1.init(Cipher.ENCRYPT_MODE, deskey);

④传入字节数组,调用Cipher.doFinal()方法,实现加密/解密,并返回一个byte字节数组

c1.doFinal(src);
参考了:http://www.cnblogs.com/lianghuilin/archive/2013/04/15/3des.html

‘贰’ 如何用Java进行3DES加密解

最近一个合作商提出使用3DES交换数据,本来他们有现成的代码,可惜只有.net版本,我们的服务器都是linux,而且应用都是Java。于是对照他们提供的代码改了一个Java的版本出来,主要是不熟悉3DES,折腾了一天,终于搞定。
所谓3DES,就是把DES做三次,当然不是简单地DES DES DES就行了,中途有些特定的排列。这个我可不关心,呵呵,我的目的是使用它。
在网上搜索了一下3DES,找到很少资料。经过朋友介绍,找到GNU Crypto和Bouncy Castle两个Java扩充包,里面应该有3DES的实现吧。
从GNU Crypto入手,找到一个TripleDES的实现类,发现原来3DES还有一个名字叫DESede,在网上搜索TripleDES和DESede,呵呵,终于发现更多的资料了。
Java的安全API始终那么难用,先创建一个cipher看看算法在不在吧
Cipher cipher = Cipher.getInstance("DESede");

如果没有抛异常的话,就证明这个算法是有效的
突然想看看JDK有没有内置DESede,于是撇开Crypto,直接测试,发现可以正确运行。在jce.jar里面找到相关的类,JDK内置了。
于是直接用DES的代码来改&测试,最后代码变成这样
SecureRandom sr = new SecureRandom();
DESedeKeySpec dks = new DESedeKeySpec(PASSWORD_CRYPT_KEY.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
return new String(Hex.encodeHex(cipher.doFinal(str.getBytes())));

需要留意的是,要使用DESede的Spec、Factory和Cipher才行
事情还没完结,合作商给过来的除了密钥之外,还有一个IV向量。搜索了一下,发现有一个IvParameterSpec类,于是代码变成这样
SecureRandom sr = new SecureRandom();
DESedeKeySpec dks = new DESedeKeySpec(PASSWORD_CRYPT_KEY.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey securekey = keyFactory.generateSecret(dks);
IvParameterSpec iv = new IvParameterSpec(PASSWORD_IV.getBytes());
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, securekey, iv, sr);
return new String(Hex.encodeHex(cipher.doFinal(str.getBytes())));

但是,运行报错了
java.security.: ECB mode cannot use IV

ECB是什么呢?我的代码完全没有写ECB什么的
又上网搜索,结果把DES的来龙去脉都搞清楚了
http://www.tropsoft.com/strongenc/des.htm
ECB是其中一种字串分割方式,除了DES以外,其他加密方式也会使用这种分割方式的,而Java默认产生的DES算法就是用ECB方法,ECB不需要向量,当然也就不支持向量了
除了ECB,DES还支持CBC、CFB、OFB,而3DES只支持ECB和CBC两种
http://www.tropsoft.com/strongenc/des3.htm
CBC支持并且必须有向量,具体算法这里就不说了。合作商给的.net代码没有声明CBC模式,似乎是.net默认的方式就是CBC的
于是把模式改成CBC
Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");

成功运行了
后话:
搜索的过程中,找到一个不错的讨论
http://www.lslnet.com/linux/dosc1/21/linux-197579.htm

在CBC(不光是DES算法)模式下,iv通过随机数(或伪随机)机制产生是一种比较常见的方法。iv的作用主要是用于产生密文的第一个block,以使
最终生成的密文产生差异(明文相同的情况下),使密码攻击变得更为困难,除此之外iv并无其它用途。因此iv通过随机方式产生是一种十分简便、有效的途
径。此外,在IPsec中采用了DES-CBC作为缺省的加密方式,其使用的iv是通讯包的时间戳。从原理上来说,这与随机数机制并无二致。
看来,向量的作用其实就是salt
最大的好处是,可以令到即使相同的明文,相同的密钥,能产生不同的密文
例如,我们用DES方式在数据保存用户密码的时候,可以另外增加一列,把向量同时保存下来,并且每次用不同的向量。这样的好处是,即使两个用户的密码是一样的,数据库保存的密文,也会不一样,就能降低猜测的可能性
另外一种用法,就是类似IPsec的做法,两部主机互传数据,保证两部机的时钟同步的前提下(可以取样到分钟或更高的单位避免偏差),用时钟的变化值作为向量,就能增加被sniffer数据的解密难度

‘叁’ java 3des双倍长 有参考的代码给提供下吗

虽然不知道你说的双倍长是什么意思,这是我自己用的3des工具类

密文是把byte数组转化成16进制字符串,一个byte对应两个数字,不知道是不是你说的双倍


/**
*DESede(3DES)加解密整理--pangjs2013.12.04
*/
publicclassDESede{

/**定义加密算法。可用DES,DESede,Blowfish*/
="DESede";

privatestaticfinalchar[]hex="0123456789abcdef".toCharArray();

publicstaticfinalStringkeyStr=StringUtil.DeviceKey;

/**必须是24位*/
privatestaticbyte[]key=strToBytes(keyStr);

/**
*加密,参数有问题返回null
*@paramsrc明文
*@return16进制字符串密文
*/
publicstaticStringencrypt(Stringsrc){
if(src==null){
returnnull;
}
try{
byte[]origin=src.getBytes("utf-8");
returnbytesToStr(des3Init(Cipher.ENCRYPT_MODE,origin));
}catch(Exceptione){
e.printStackTrace();
returnnull;
}
}

/**
*解密,参数有问题返回null
*@paramcipher(16进制字符串密文)
*@return明文
*/
publicstaticStringdecrypt(Stringcipher){
前凯if(cipher==null){
returnnull;
}
try{
byte[]origin=des3Init(Cipher.DECRYPT_MODE,strToBytes(cipher));
returnnewString(origin,"utf-8");
}catch(Exceptione){
e.printStackTrace();
returnnull;
}
}

/**
*3des加解密
*@parammodeCipher.ENCRYPT_MODE|Cipher.DECRYPT_MODE
慧皮唤*@paraminputbyte[]
*@returnbyte[]
*@,InvalidKey,NoSuchPadding,BadPadding,IllegalBlockSize
*/
privatestaticbyte[]des3Init(intmode,byte[]input)throwsException{
//根据【给定的字节数组key】和【指定算法DESede(3des)】构造一个密钥
SecretKeysecretKey=newSecretKeySpec(key,Algorithm);
//加解密
Ciphercipher=Cipher.getInstance(Algorithm);
cipher.init(mode,secretKey);
returncipher.doFinal(input);
}

握睁/**
*byte数组转换为16进制字符串
*@paramb[1,33,79,88,-120]
*@return"01214f5888"
*/
privatestaticStringbytesToStr(byte[]b){
StringBuilders=newStringBuilder();
for(inti=0;i<b.length;i++){
s.append(hex[(b[i]>>>4)&0xf]);
s.append(hex[b[i]&0xf]);
}
returns.toString();
}

/**
*16进制字符串转换为相应的byte数组
*@paramsrc"81214f5888"
*@return[-127,33,79,88,-120]
*/
privatestaticbyte[]strToBytes(Stringsrc){
char[]c=src.toCharArray();
byte[]b=newbyte[c.length/2];
for(inti=0;i<b.length;i++){
b[i]=(byte)((Character.digit((int)c[2*i],16)<<4)
|Character.digit((int)c[2*i+1],16));
}
returnb;
}

}

‘肆’ 如何用Java进行3DES加密解密

Java进行3DES加密解密代码如下:

<preclass="java"name="code">publicstaticStringbyte2hex(byte[]b){

Stringhs="";

Stringstmp="";

for(intn=0;n<b.length;n++){

stmp=Integer.toHexString(b[n]&0xFF);

if(stmp.length()==1)

hs+=("0"+stmp);

else

hs+=stmp;

}

returnhs.toUpperCase();

}</pre><br>

<pre></pre>

<p><br>

3DES的加密密钥长度要求是24个字节,本例中因为给定的密钥只有16个字节,所以需要填补至24个字节。</p>

<p>其中"DESede/ECB/NoPadding",除此之外,3DES还支持"<spanstyle="color:#0000ff">DESede/CBC/PKCS5Padding</span>"模式。</p>

‘伍’ 求java中3des加密解密示例

在java中调用sun公司提供的3DES加密解密算法时,需要使用到$JAVA_HOME/jre/lib/目录下如下的4个jar包:
jce.jar
security/US_export_policy.jar
security/local_policy.jar
ext/sunjce_provider.jar
Java运行时会自动加载这些包,因此对于带main函数的应用程序不需要设置到CLASSPATH环境变量中。对于WEB应用,不需要把这些包加到WEB-INF/lib目录下。
以下是java中调用sun公司提供的3DES加密解密算法的样本代码:
加密解密代码
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/*字符串 DESede(3DES) 加密*/
public class ThreeDes {
/**
* @param args在java中调用sun公司提供的3DES加密解密算法时,需要使
* 用到$JAVA_HOME/jre/lib/目录下如下的4个jar包:
*jce.jar
*security/US_export_policy.jar
*security/local_policy.jar
*ext/sunjce_provider.jar
*/
private static final String Algorithm ="DESede"; //定义加密算法,可用 DES,DESede,Blowfish
//keybyte为加密密钥,长度为24字节
//src为被加密的数据缓冲区(源)
public static byte[] encryptMode(byte[] keybyte,byte[] src){
try {
//生成密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
//加密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
return c1.doFinal(src);//在单一方面的加密或解密
} catch (java.security.NoSuchAlgorithmException e1) {
// TODO: handle exception
e1.printStackTrace();
}catch(javax.crypto.NoSuchPaddingException e2){
e2.printStackTrace();
}catch(java.lang.Exception e3){
e3.printStackTrace();
}
return null;
}
//keybyte为加密密钥,长度为24字节
//src为加密后的缓冲区
public static byte[] decryptMode(byte[] keybyte,byte[] src){
try {
//生成密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
//解密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
// TODO: handle exception
e1.printStackTrace();
}catch(javax.crypto.NoSuchPaddingException e2){
e2.printStackTrace();
}catch(java.lang.Exception e3){
e3.printStackTrace();
}
return null;
}
//转换成十六进制字符串
public static String byte2Hex(byte[] b){
String hs="";
String stmp="";
for(int n=0; n<b.length; n++){
stmp = (java.lang.Integer.toHexString(b[n]& 0XFF));
if(stmp.length()==1){
hs = hs + "0" + stmp;
}else{
hs = hs + stmp;
}
if(n<b.length-1)hs=hs+":";
}
return hs.toUpperCase();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//添加新安全算法,如果用JCE就要把它添加进去
Security.addProvider(new com.sun.crypto.provider.SunJCE());
final byte[] keyBytes = {0x11, 0x22, 0x4F, 0x58,
(byte)0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79,0x51,
(byte)0xCB,
(byte)0xDD, 0x55, 0x66, 0x77, 0x29, 0x74,
(byte)0x98, 0x30, 0x40, 0x36,
(byte)0xE2
}; //24字节的密钥
String szSrc = "This is a 3DES test. 测试";
System.out.println("加密前的字符串:" + szSrc);
byte[] encoded = encryptMode(keyBytes,szSrc.getBytes());
System.out.println("加密后的字符串:" + new String(encoded));
byte[] srcBytes = decryptMode(keyBytes,encoded);
System.out.println("解密后的字符串:" + (new String(srcBytes)));
}
}

‘陆’ 如何用Java进行3DES加密解密

这里是例子,直接拿来用就可以了。
package com.nnff.des;

import java.security.Security;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/*字符串 DESede(3DES) 加密
* ECB模式/使用PKCS7方式填充不足位,目前给的密钥是192位
* 3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的
* 加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加
* 密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的
* 密钥,P代表明文,C代表密表,这样,
* 3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
* 3DES解密过程为:P=Dk1((EK2(Dk3(C)))
* */
public class ThreeDes {

/**
* @param args在java中调用sun公司提供的3DES加密解密算法时,需要使
* 用到$JAVA_HOME/jre/lib/目录下如下的4个jar包:
*jce.jar
*security/US_export_policy.jar
*security/local_policy.jar
*ext/sunjce_provider.jar
*/

private static final String Algorithm = "DESede"; //定义加密算法,可用 DES,DESede,Blowfish
//keybyte为加密密钥,长度为24字节
//src为被加密的数据缓冲区(源)
public static byte[] encryptMode(byte[] keybyte,byte[] src){
try {
//生成密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
//加密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
return c1.doFinal(src);//在单一方面的加密或解密
} catch (java.security.NoSuchAlgorithmException e1) {
// TODO: handle exception
e1.printStackTrace();
}catch(javax.crypto.NoSuchPaddingException e2){
e2.printStackTrace();
}catch(java.lang.Exception e3){
e3.printStackTrace();
}
return null;
}

//keybyte为加密密钥,长度为24字节
//src为加密后的缓冲区
public static byte[] decryptMode(byte[] keybyte,byte[] src){
try {
//生成密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
//解密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
// TODO: handle exception
e1.printStackTrace();
}catch(javax.crypto.NoSuchPaddingException e2){
e2.printStackTrace();
}catch(java.lang.Exception e3){
e3.printStackTrace();
}
return null;
}

//转换成十六进制字符串
public static String byte2Hex(byte[] b){
String hs="";
String stmp="";
for(int n=0; n<b.length; n++){
stmp = (java.lang.Integer.toHexString(b[n]& 0XFF));
if(stmp.length()==1){
hs = hs + "0" + stmp;
}else{
hs = hs + stmp;
}
if(n<b.length-1)hs=hs+":";
}
return hs.toUpperCase();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//添加新安全算法,如果用JCE就要把它添加进去
Security.addProvider(new com.sun.crypto.provider.SunJCE());
final byte[] keyBytes = {0x11, 0x22, 0x4F, 0x58,
(byte)0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79, 0x51,
(byte)0xCB,
(byte)0xDD, 0x55, 0x66, 0x77, 0x29, 0x74,
(byte)0x98, 0x30, 0x40, 0x36,
(byte)0xE2
}; //24字节的密钥
String szSrc = "This is a 3DES test. 测试";
System.out.println("加密前的字符串:" + szSrc);
byte[] encoded = encryptMode(keyBytes,szSrc.getBytes());
System.out.println("加密后的字符串:" + new String(encoded));

byte[] srcBytes = decryptMode(keyBytes,encoded);
System.out.println("解密后的字符串:" + (new String(srcBytes)));
}
}

‘柒’ 哪位大神用C#翻译一下如下Java代码(3DES加密)

为啥要“翻译”?

Java 的加解密类有其自己的内部实现,比如 SecretKeySpec、IvParameterSpec、Cipher 这几个对象,你用的时候直接声明一个对象就完了,实际上底层做了很多工作你是看不见的。

而 C# 也有自己的加解密类,完全不是说、也不需要“从XXX语言翻译”过来。3DES加解密这种算法随便一搜就有很多实现代码。

热点内容
androidactivity事件 发布:2025-09-14 18:09:43 浏览:706
文件夹名字透明 发布:2025-09-14 18:02:37 浏览:487
计算机退出域之后密码是什么 发布:2025-09-14 17:53:00 浏览:996
美猴云服务器 发布:2025-09-14 17:51:29 浏览:754
编译预处理时打印宏的值 发布:2025-09-14 17:11:53 浏览:70
linuxvim插件 发布:2025-09-14 17:11:04 浏览:950
linux导航 发布:2025-09-14 17:08:57 浏览:510
问道登陆器源码 发布:2025-09-14 17:08:01 浏览:913
为什么安卓手机总是提示软件停运 发布:2025-09-14 17:01:27 浏览:971
破解exe加密视频软件 发布:2025-09-14 16:44:18 浏览:290