3DES,为什么3des的中间部分采用了解密而不是加密
来源:整理 编辑:智能门户 2023-08-15 05:36:22
本文目录一览
1,为什么3des的中间部分采用了解密而不是加密
这样做的好处是当你用同样的key(即k1=k2=k3=k)带入E(k3,D(k2,E(k1,m)))时,里面两层的D和E消去,3DES就会退化为一个普通的DES。
2,到底什么是3倍DES
就是3des,你可以理解为使用3个不同的密钥对每个明文数据块进行了3次des加密:3DES加密过程为:C=Ek3(Dk2(Ek1(M)))3DES解密过程为:M=Dk1(EK2(Dk3(C))E表示加密算法,D表示解密算法。
3,什么是MAC 3EDS算法
MAC是在CPU卡通讯中的一种数据保护的算法方式;就是将要传松的数据通过MAC计算,产生MAC码跟在数据串后面,发送给设备,设备接收到数据后,用相同的算法验证下MAC是否正确,如果正确,就行进数据处理,否则就提示MAC码错误;3DES的MAC码计算一般是把数据分段成8字节的来进行运算,的,不足8字节的需要补齐,首先用第一个数据块和初试数据进行异或,然后用左8字节的密码进行DES加密,将结果和第二包数据异或,在用左8字节的密码加密,知道最后一包数据,然后在右8字节的密码DES解密,然后再用左8字节的密码进行DES加密得到8个字节的MAC码.
4,高分求关于java的3des加密的bug解决办法要求能用16位key并且不
在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; nstmp = (java.lang.Integer.toHexString(b[n]& 0XFF)); if(stmp.length()==1){ hs = hs + "0" + stmp; }else{ hs = hs + stmp; } if(n } 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))); } }
5,如何用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; nstmp = (java.lang.Integer.toHexString(b[n]& 0XFF)); if(stmp.length()==1){ hs = hs + "0" + stmp; }else{ hs = hs + stmp; } if(n } 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))); } }public static string encryptkey(string mainkey,string plainkey){ string encryptkey = ""; try{ security.addprovider(new org.bouncycastle.jce.provider.bouncycastleprovider()); string algorithm = "desede/ecb/nopadding"; byte[] hb = hex2byte(mainkey.getbytes()); byte[] k = new byte[24]; system.arraycopy(hb,0,k,0,16); system.arraycopy(hb,0,k,16,8); secretkey deskey = new secretkeyspec(k, algorithm); cipher c1 = cipher.getinstance(algorithm); c1.init(cipher.encrypt_mode, deskey); encryptkey = byte2hex(c1.dofinal(hex2byte(plainkey.getbytes()))); }catch(exception e){ e.printstacktrace(); } return encryptkey; }public static string byte2hex(byte[] b) { string hs = ""; string stmp = ""; for (int n = 0; n < b.length; n++) { stmp = integer.tohexstring(b[n] & 0xff); if (stmp.length() == 1) hs += ("0" + stmp); else hs += stmp; } return hs.touppercase(); } 3des的加密密钥长度要求是24个字节,本例中因为给定的密钥只有16个字节,所以需要填补至24个字节。
文章TAG:
3DES 为什么3des的中间部分采用了解密而不是加密
大家都在看
-
苹果自动同步怎么关闭,关闭手机应用如何进行
2022-12-30
-
iphone手机自动触摸,手机屏幕跳动可能是因为系统有问题
2022-12-30
-
酷睿 自动降频,为什么要关闭cpu自动降频?答案揭晓!
2023-01-22
-
怎么设置自动换锁屏壁纸,手机锁屏壁纸怎么设置自动更换?
2023-01-23
-
手机很快自动锁屏,手机自动锁屏怎么回事?看视频就ok了!
2023-01-25
-
Flyme6开启自动开关机,魅族6如何发力关机?
2023-02-07
-
笔记本fn键自动使用,如何使用小米笔记本电脑进行安全配置?
2023-02-09
-
宁波优塑智能科技怎么样,宁波优创是不是做华为的呀谁买过他们的东西啊价格好吗
2023-02-16
-
龙浦智能科技股份怎么样,马丁路德机器人公司怎么样
2023-02-16
-
余额宝自动赚钱是怎么回事,理财有讲究!财富自由
2023-02-19
-
智能科技护腰带怎么用,石墨烯护腰带好用吗
2023-02-22
-
北京建筑智能科技怎么样,建筑智能化工程技术以后容易就业吗月薪怎么样
2023-02-23
-
iphone5如何自动导出图图片片,从电脑手机怎么用?
2023-02-28
-
带着外星科技闯都市,现代都市小说 主角无敌 带外星科技的小说
2023-03-06
-
智能电视频繁自动切换,电视机器停电后自动启动一般原因如下
2023-03-15