3des的desede解密软件 desede和3des区别 - 电脑技术中心 - 【漳州电脑网】_漳州电脑维修_漳州笔记本电脑维修_监控安装_市区上门维修

全国统一24小时服务热线:400-0000-000400-0000-000  / 1399000000

当前位置:首页 > 电脑技术中心 > 正文

3des的desede解密软件 desede和3des区别

发布日期:2020-10-09

摘要:如何用Java进行3DES加密解密Java进行3DES加密解密代码如下:public static String byte2hex(byte...

3des的desede解密软件

如何用Java进行3DES加密解密

Java进行3DES加密解密代码如下:<pre class="java" name="code">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(); }</pre><br> <pre></pre> <p><br> 3DES的加密密钥长度要求是24个字节,本例中因为给定的密钥只有16个字节,所以需要填补至24个字节。

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

</p>

求帮助:下面这段字符串先经过base64解码再用3des解密后得到的数...

首先是加密方法 package logic; import java.security.Key; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory;//import javax.crypto.SecretKey; import javax.crypto.spec.DESedeKeySpec;//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 */ //加密密钥 public final static 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 }; //private static final String Algorithm = "DESede/ECB/PKCS5Padding"; //定义加密算法,可用 DES,DESede,Blowfish //keybyte为加密密钥,长度为24字节 //src为被加密的数据缓冲区(源) public static byte[] encryptMode(byte[] keybyte,byte[] src){ try { Key deskey = null; DESedeKeySpec spec = new DESedeKeySpec(keybyte); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede"); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance("DESede" + "/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, deskey); //生成密钥 //SecretKey deskey = new SecretKeySpec(keybyte, Algorithm); //加密 //Cipher c1 = Cipher.getInstance(Algorithm); //c1.init(Cipher.ENCRYPT_MODE, deskey); return cipher.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 { Key deskey = null; //获取密钥 DESedeKeySpec spec = new DESedeKeySpec(keybyte); //加密算法 SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede"); //生成密码 deskey = keyfactory.generateSecret(spec); //加入模式和填充方法 Cipher cipher = Cipher.getInstance("DESede" + "/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, deskey); //生成密钥 //SecretKey deskey = new SecretKeySpec(keybyte, Algorithm); //解密 //Cipher c1 = Cipher.getInstance(Algorithm); //c1.init(Cipher.DECRYPT_MODE, deskey); return cipher.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 stmp = (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()); //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))); } } 调用加密方法后给他编码 ~~~ byte[] encoded = ThreeDes.encryptMode(ThreeDes.keyBytes,body.getBytes()); //用 BASE64给密文编码(要不然解密出错) BASE64Encoder enc = new BASE64Encoder(); String cipherString = enc.encode(encoded);

如何用Java进行3DES加密解

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

des算法加密解密的实现

生成L2,R2…… 一共经过16次运算。

其中R16为L15与f(R15,得到8个数;7,y 列的值Sxy。

将Sxy化为二进制,即得Si盒的输出: E: 32 1 2 3 4 5 4 5 6 7 8 9 8 9 10 11 12 13 12 13 14 15 16 17 16 17 18 19 20 21 20 21 22 23 24 25 24 25 26 27 28 29 28 29 30 31 32 31 膨胀后的比特串分为8组,每组6比特。

各组经过各自的S盒后; } for(i=1;i<经过E变换扩充: for(i=1;i&lt,s3,s4。

下面进行迭代,又变为4比特(具体过程见后),合并后又成为32比特;=48; s[5]=s5[s51[6]+s51[1]*2][s51[5]+s51[4]*2+s51[3]*4+s51[2]*8]; s[6]=s6[s61[6]+s61[1]*2][s61[5]+s61[4]*2+s61[3]*4+s61[2]*8]。

for(i=1;i</下面经过S盒,因此只给出其中一次。

明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。

其加密过程图示如下: DES算法加密过程 对DES算法加密过程图示的说明如下。

它的功能是将32比特的输入再转化为32比特的输出,DES算法加密原理讲完了。

在VC++6。

其过程如图所示; s21[i]=RE1[i+6]; s31[i]=RE1[i+12]; s41[i]=RE1[i+18]; s51[i]=RE1[i+24]; s61[i]=RE1[i+30]; s71[i]=RE1[i+36]; s81[i]=RE1[i+42]; }/。

设该明文串为m=m1m2…m64 (mi=0或1)。

下面再讲一下S盒的变换过程。

任取一S盒。

见图;=48。

下面再讲一下变换f(Ri-1。

S1,s2,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。

由于各次迭代的方法相同只是输入输出不同。

R0子密钥K1(子密钥的生成将在后面讲)经过变换f(R0,K1)(f变换将在下面讲)输出32位的比特串f1.0下的程序源代码为,b2,b3,Ki),再从Si表中查出x 行。

R16与L16合并成64位的比特串。

值得注意的是R16一定要排在L16前面。

R16与L16合并后成的比特串,经过置换IP-1后所得比特串的下标列表如下: IP-1 40 8 48 16 56 24 64 32 39 7 47 15 55 23 63 31 38 6 46 14 54 22 62 30 37 5 45 13 53 21 61 29 36 4 44 12 52 20 60 28 35 3 43 11 51 19 59 27 34 2 42 10 50 18 58 26 33 1 41 9 49 17 57 25 经过置换IP-1后生成的比特串就是密文e.;=64;i++) { if(RE1[i]==2) RE1[i]=0。

该32比特经过P变换后;i++)////,b4,b5;i++)//。

以第八次为例:/ s[3]=s3[s31[6]+s31[1]*2][s31[5]+s31[4]*2+s31[3]*4+s31[2]*8]; s[4]=s4[s41[6]+s41[1]*2][s41[5]+s41[4]*2+s41[3]*4+s41[2]*8];与K8按位作不进位加法运算 RE1[i]=RE1[i]+K8[i],f1与L0做不进位的二进制加法运算:待加密的64比特明文串m,经过IP置换后,得到的比特串的下标列表如下: IP 58 50 42 34 26 18 10 2 60 52 44 36 28 20 12 4 62 54 46 38 30 22 14 6 64 56 48 40 32 24 16 8 57 49 41 33 25 17 9 1 59 51 43 35 27 19 11 3 61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7 该比特串被分为32位的L0和32位的R0两部分;i++)//,由32位变为48位 RE1[i]=R7[E[i-1]]: 在其输入b1,其下标列表如下: f1与L0做不进位的二进制加法运算后的结果赋给R1,R0则原封不动的赋给L1; for(i=1;i&lt,s7,s8分别为S表 s[1]=s1[s11[6]+s11[1]*2][s11[5]+s11[4]*2+s11[3]*4+s11[2]*8]; s[2]=s2[s21[6]+s21[1]*2][s21[5]+s21[4]*2+s21[3]*4+s21[2]*8]; s[7]=s7[s71[6]+s71[1]*2][s71[5]+s71[4]*2+s71[3]*4+s71[2]*8]; s[8]=s8[s81[6]+s81[1]*2][s81[5]+s81[4]*2+s81[3]*4+s81[2]*8]; for(i=0;i<8;i++)//8个数变换输出二进制 { for(j=1;j<5;j++) { temp[j]=s[i+1]%2; s[i+1]=s[i+1]/2; } for(j=1;j<5;j++) f[4*i+j]=temp[5-j]; } for(i=1;i<33;i++)//经过P变换 frk[i]=f[P[i-1]];//S盒运算完成 for(i=1;i<33;i++)//左右交换 L8[i]=R7[i]; for(i=1;i<33;i++)//R8为L7与f(R,K)进行不进位二进制加法运算结果 { R8[i]=L7[i]+frk[i]; if(R8[i]==2) R8[i]=0; } [ 原创文档 本文适合中级读者 已阅读21783次 ] 文档 代码 工具 DES算法及其在VC++6.0下的实现(下) 作者:航天医学工程研究所四室 朱彦军 在《DES算法及其在VC++6.0下的实现(上)》中主要介绍了DES算法的基本原理,下面让我们继续: 二.子密钥的生成 64比特的密钥生成16个48比特的子密钥。

其生成过程见图: 子密钥生成过程具体解释如下: 64比特的密钥K,经过PC-1后,生成56比特的串。

其下标如表所示: PC-1 57 49 41 33 25 17 9 1 58 50 42 34 26 18 10 2 59 51 43 35 27 19 11 3 60 52 44 36 63 55 47 39 31 23 15 7 62 54 46 38 30 22 14 6 61 53 45 37 29 21 13 5 28 20 12 4 该比特串分为长度相等的比特串C0和D0。

然后C0和D0分别循环左移1位,得到C1和D1。

C1和D1合并起来生成C1D1。

C1D1经过PC-2变换后即生成48比特的K1。

K1的下标列表为: PC-2 14 17 11 24 1 5 3 28 15 6 21 10 23 19 12 4 26 8 16 7 27 20 13 2 41 52 31 37 47 55 30 40 51 45 33 48 44 49 39 56 34 53 46 42 50 36 29 32 C1、D1分别循环左移LS2位,再合并,经过PC-2,生成子密钥K2……依次类推直至生成子密钥K16。

注意:Lsi (I =1,2,….16)的数值是不同的。

具体见下表: 迭代顺序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 左移位数 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1 生成子密钥的VC程序源代码如下: for(i=1;i<57;i++)//输入64位K,经过PC-1变为56位 k0[i]=k[PC_1[i-1]]; 56位的K0,均分为28位的C0,D0。

C0,D0生成K1和C1,D1。

以下几次迭代方法相同,仅以生成K8为例。

for(i=1;i<27;i++)//循环左移两...

php 经3des 怎样兼容 java

crypto.SecretKey; import javax.crypto; }catch(javax.DECRYPT_MODE, deskey);/加密 Cipher c1 = Cipher.getInstance(Algorithm); + stmp,DESede,Blowfish // c1.crypto.provider;; //b.printStackTrace(); /目录4jar包.jar *security/: *jce.lang.Integer.toHexString(b[n]& 0XFF));src加密缓冲区 public static byte[] decryptMode(byte[] keybyte,byte[] src){ try { //; } return hs, Algorithm), Algorithm);/src加密数据缓冲区(源) public static byte[] encryptMode(byte[] keybyte,byte[] src){ try { //.printStackTrace();US_export_policy.jar *security/local_policy; if(stmp.length()==1){ hs = hs + "0&quot例直接拿用package com; import javax:设Ek()Dk()代表DES算加密解密程K代表DES算使用 * 密钥P代表明文C代表密表 * 3DES加密程:C=Ek3(Dk2(Ek1(P))) * 3DES解密程;//:P=Dk1((EK2(Dk3(C))) * */定义加密算;密钥 SecretKey deskey = new SecretKeySpec(keybyte; }catch(java.lang;/添加新安全算.crypto.NoSuchPaddingException e2){ e2.crypto.Cipher; TODO Auto-generated method stub /.addProvider(new com;jre/** * @param argsjava调用sun公司提供3DES加密解密算需要使 * 用$JAVA_HOME/.NoSuchPaddingException e2){ e2.printStackTrace(); }catch(java,用JCE要添加进 Security;/keybyte加密密钥度24字节 // return c1.doFinal(src); n++){ stmp = (java.nnff.des; import java:&quot.NoSuchAlgorithmException e1) { /DESede" } catch (java.security; } / import javax.jar *ext/sunjce_provider.jar */ private static final String Algorithm = " } return null; } //.toUpperCase();/解密 Cipher c1 = Cipher.getInstance(Algorithm); for(int n=0; n<b.length.length-1)hs=hs+";使用PKCS7式填充足位,目前给密钥192位 * 3DES(即Triple DES)DES向AES渡加密算(1999NIST3-DES指定渡 * 加密标准)DES更安全变形DES基本模块通组合组设计组加 * 密算其具体实现;keybyte加密密钥度24字节 / TODO.ENCRYPT_MODE, deskey);/ TODO: handle exception e1.spec.SecretKeySpec; /*字符串 DESede(3DES) 加密 * ECB模式/,用 DES; }else{ hs = hs + stmp; } if(n&lt.SunJCE());单面加密或解密 } catch (java.init(Cipher; public class ThreeDes { /密钥 SecretKey deskey = new SecretKeySpec(keybyte;lib/转换十六进制字符串 public static String byte2Hex(byte[] b){ String hs=""; /.printStackTrace(); c1.Exception e3){ e3; return c1.doFinal(src).security.NoSuchAlgorithmException e1) { //: handle exception e1.printStackTrace(); }catch(javax.crypto.sun.lang.Exception e3){ e3.printStackTrace(); } return null.security.Security; } public static void main(String[] args) { // 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))); } }-.init(Cipher; String stmp=""

c# 做一个DES算法加密解密的窗体

虽然不知道你说的双倍长是什么意思,这是我自己用的3des工具类 密文是把byte数组转化成16进制字符串,一个byte对应两个数字,不知道是不是你说的双倍/** * DESede(3DES)加解密整理--pangjs 2013.12.04 */ public class DESede { /** 定义加密算法。

可用 DES,DESede,Blowfish*/ private static final String Algorithm = "DESede"; private static final char[] hex = "0123456789abcdef".toCharArray(); public static final String keyStr = StringUtil.DeviceKey; /**必须是24位*/ private static byte[] key = strToBytes(keyStr); /** * 加密,参数有问题返回null * @param src 明文 * @return 16进制字符串密文 */ public static String encrypt(String src) { if(src == null){ return null; } try { byte[] origin = src.getBytes("utf-8"); return bytesToStr(des3Init(Cipher.ENCRYPT_MODE, origin)); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 解密,参数有问题返回null * @param cipher (16进制字符串密文) * @return 明文 */ public static String decrypt(String cipher) { if(cipher == null){ return null; } try { byte[] origin = des3Init(Cipher.DECRYPT_MODE, strToBytes(cipher)); return new String(origin, "utf-8"); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 3des加解密 * @param mode Cipher.ENCRYPT_MODE | Cipher.DECRYPT_MODE * @param input byte[] * @return byte[] * @throws Exception NoSuchAlgorithm,InvalidKey,NoSuchPadding,BadPadding,IllegalBlockSize */ private static byte[] des3Init(int mode, byte[] input) throws Exception{ // 根据【给定的字节数组key】和【 指定算法DESede(3des)】构造一个密钥 SecretKey secretKey = new SecretKeySpec(key, Algorithm); // 加解密 Cipher cipher = Cipher.getInstance(Algorithm); cipher.init(mode, secretKey); return cipher.doFinal(input); } /** * byte数组转换为16进制字符串 * @param b [1, 33, 79, 88, -120] * @return "01214f5888" */ private static String bytesToStr(byte[] b){ StringBuilder s = new StringBuilder(); for (int i = 0; i s.append(hex[(b[i]>>>4)&0xf]); s.append(hex[b[i]&0xf]); } return s.toString(); } /** * 16进制字符串转换为相应的byte数组 * @param src "81214f5888" * @return [-127, 33, 79, 88, -120] */ private static byte[] strToBytes(String src){ char[] c = src.toCharArray(); byte[] b = new byte[c.length/2]; for (int i = 0; i b[i] = (byte)((Character.digit((int)c[2*i], 16) | Character.digit((int)c[2*i+1], 16)); } return b; } }

求C语言编写的DES加密解密源代码

23,24,49,17;int E_Table[48] = {31,8;typedef char ElemType;{{15,1,8,14,11,3,4,9,7,2,13,47,39,5},{0,2,29,30,28,11; /,18,10,15,4,2,11,6};/,22,62.baidu,21,10,6,40,32,21,61;/* 扩充置换表E */, 27,28,13,1,10,4, 5, 6;int IP_Table[64] = { 57://hi.baidu.com/493168771/blog/item/5816b034ca19fc44251f144c,9从别的地方抄来的http;int S[8][4][16] =/,8},{4,2,27,19,12,0,5,10},{3.html#include "stdio.h&quot,45,37,7},{0, 19,20,9}},16,56,15,7, 56,48,15,7,4,14,23,63, 32, 4, 3, 4,/* S2 */,5, 23,24,5;int IP_1_Table[64] = {39,7,47;* S1 */{{{14,4,13,13,53,7;#include "time,14,7,11,1,11,1,2,12,11,3, 61,53,7,8,6,5,20,60,17,18,29,21, 62,12,9,7,3,10,9, 0, 1,1,13,5, 63,55,11,3,14,0,27, 34,2,42,36,28, 60,8},{13,7,0,9,3,4,6,10,57,25,31,23, 7, 8.h"#include &quot,0,10,6,12,3,15,11,11,12, 2, 3,24};/* S盒 */,1, 15,16,17,9,1, 59,51;* 置换函数P */,5;int P_Table[32] = {15,8, 8,9,10,10,6,9,11,11,15,38,30,27,16,19,59,50,42,43,35,19,20,0,3,4,15,16,12,0,5,14, 58,2,0},{15,12,3,12,11,14,54,31, 38,6,46,10,4,13,22,14,3,/* S3 */,12,7,11,14,12,13,14,1},{13,6,4,9,8,15,29, 36,4,44,12,6,9,3,2,15},{13,8,10,7},{1,9;* 逆初始置换表IP^-1 */,30, 37,5,45;* 初始置换表IP */,6, 0,8,3,30,9, 1,7,23,11,51,3,11,15,2,12,29,5,10,14,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}},/* S4 */{{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},{13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},{10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},{3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}},/* S5 */{{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},{14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},{4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},{11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}},/* S6 */{{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},{10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},{9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},{4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}},/* S7 */{{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},{13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},{1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},{6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}},/* S8 */{{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},{1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},{7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},{2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}}};/* 置换选择1 */int PC_1[56] = {56,48,40,32,24,16,8, 0,57,49,41,33,25,17, 9,1,58,50,42,34,26, 18,10,2,59,51,43,35, 62,54,46,38,30,22,14, 6,61,53,45,37,29,21, 13,5,60,52,44,36,28, 20,12,4,27,19,11,3};/* 置换选择2 */int PC_2[48] = {13,16,10,23,0,4,2,27, 14,5,20,9,22,18,11,3, 25,7,15,6,26,19,12,1, 40,51,30,36,46,54,29,39, 50,44,32,46,43,48,38,55, 33,52,45,41,49,35,28,31};/* 对左移次数的规定 */int MOVE_TIMES[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};int ByteToBit(ElemType ch,ElemType bit[8]);int BitToByte(ElemType bit[8],ElemType *ch);int Char8ToBit64(ElemType ch[8],ElemType bit[64]);int Bit64ToChar8(ElemType bit[64],ElemType ch[8]);int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]);int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]);int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]);int DES_ROL(ElemType data[56], int time);int DES_IP_Transform(ElemType data[64]);int DES_IP_1_Transform(ElemType data[64]);int DES_E_Transform(ElemType data[48]);int DES_P_Transform(ElemType data[32]);int DES_SBOX(ElemType data[48]);int DES_XOR(ElemType R[48], ElemType L[48],int count);int DES_Swap(ElemType left[32],ElemType right[32]);int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]);int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48], ElemType plainBlock[8]);int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile);int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile); /* 字节转换成二进制 */int ByteToBit(ElemType ch, ElemType bit[8]){ int cnt; for(cnt = 0;cnt >cnt)&1; } return 0;}/* 二进制转换成字节 */int BitToByte(ElemType bit[8],ElemType *ch){ int cnt; for(cnt = 0;cnt < 8; cnt++){ *ch |= *(bit + cnt)<<cnt; } return 0;}/* 将长度为8的字符串转为二进制位串 */int Char8ToBit64(ElemType ch[8],ElemType bit[64]){ int cnt; for(cnt = 0; cnt < 8; cnt++){ ByteToBit(*(ch+cnt),bit+(cnt<<3)); } return 0;}/* 将二进制位串转为长度为8的字符串 */int Bit64ToChar8(ElemType bit[64],ElemType ch[8]){ int cnt; memset(ch,0,8); for(cnt = 0; cnt < 8; cnt++){ BitToByte(bit+(cnt<<3),ch+cnt); } return 0;}/* 生成子密钥 */int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]){ ElemType temp[56]; int cnt; DES_PC1_Transform(key,temp);/* PC1置换 */ for(cnt = 0; cnt < 16; cnt++){/* 16轮跌代,产生16个子密钥 */ DES_ROL(temp,MOVE_TIMES[cnt]);/* 循环左移 */ DES_PC2_Transform(temp,subKeys[cnt]);/* PC2置换,产生子密钥 */ } return 0;}/* 密钥置...

如何用JAVA实现字符串简单加密解密?

java加密字符串可以使用des加密算法,实例如下:package test;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.security.*;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;/** * 加密解密 * * @author shy.qiu * @since http://blog.csdn.net/qiushyfm */public class CryptTest { /** * 进行MD5加密 * * @param info * 要加密的信息 * @return String 加密后的字符串 */ public String encryptToMD5(String info) { byte[] digesta = null; try { // 得到一个md5的消息摘要 MessageDigest alga = MessageDigest.getInstance("MD5"); // 添加要进行计算摘要的信息 alga.update(info.getBytes()); // 得到该摘要 digesta = alga.digest(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } // 将摘要转为字符串 String rs = byte2hex(digesta); return rs; } /** * 进行SHA加密 * * @param info * 要加密的信息 * @return String 加密后的字符串 */ public String encryptToSHA(String info) { byte[] digesta = null; try { // 得到一个SHA-1的消息摘要 MessageDigest alga = MessageDigest.getInstance("SHA-1"); // 添加要进行计算摘要的信息 alga.update(info.getBytes()); // 得到该摘要 digesta = alga.digest(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } // 将摘要转为字符串 String rs = byte2hex(digesta); return rs; } // ////////////////////////////////////////////////////////////////////////// /** * 创建密匙 * * @param algorithm * 加密算法,可用 DES,DESede,Blowfish * @return SecretKey 秘密(对称)密钥 */ public SecretKey createSecretKey(String algorithm) { // 声明KeyGenerator对象 KeyGenerator keygen; // 声明 密钥对象 SecretKey deskey = null; try { // 返回生成指定算法的秘密密钥的 KeyGenerator 对象 keygen = KeyGenerator.getInstance(algorithm); // 生成一个密钥 deskey = keygen.generateKey(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } // 返回密匙 return deskey; } /** * 根据密匙进行DES加密 * * @param key * 密匙 * @param info * 要加密的信息 * @return String 加密后的信息 */ public String encryptToDES(SecretKey key, String info) { // 定义 加密算法,可用 DES,DESede,Blowfish String Algorithm = "DES"; // 加密随机数生成器 (RNG),(可以不写) SecureRandom sr = new SecureRandom(); // 定义要生成的密文 byte[] cipherByte = null; try { // 得到加密/解密器 Cipher c1 = Cipher.getInstance(Algorithm); // 用指定的密钥和模式初始化Cipher对象 // 参数:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE) c1.init(Cipher.ENCRYPT_MODE, key, sr); // 对要加密的内容进行编码处理, cipherByte = c1.doFinal(info.getBytes()); } catch (Exception e) { e.printStackTrace(); } // 返回密文的十六进制形式 return byte2hex(cipherByte); } /** * 根据密匙进行DES解密 * * @param key * 密匙 * @param sInfo * 要解密的密文 * @return String 返回解密后信息 */ public String decryptByDES(SecretKey key, String sInfo) { // 定义 加密算法, String Algorithm = "DES"; // 加密随机数生成器 (RNG) SecureRandom sr = new SecureRandom(); byte[] cipherByte = null; try { // 得到加密/解密器 Cipher c1 = Cipher.getInstance(Algorithm); // 用指定的密钥和模式初始化Cipher对象 c1.init(Cipher.DECRYPT_MODE, key, sr); // 对要解密的内容进行编码处理 cipherByte = c1.doFinal(hex2byte(sInfo)); } catch (Exception e) { e.printStackTrace(); } // return byte2hex(cipherByte); return new String(cipherByte); } // ///////////////////////////////////////////////////////////////////////////// /** * 创建密匙组,并将公匙,私匙放入到指定文件中 * * 默认放入mykeys.bat文件中 */ public void createPairKey() { try { // 根据特定的算法一个密钥对生成器 KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA"); // 加密随机数生成器 (RNG) SecureRandom random = new SecureRandom(); // 重新设置此随机对象的种子 random.setSeed(1000); // 使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器 keygen.initialize(512, random);// keygen.initialize(512); // 生成密钥组 KeyPair keys = keygen.generateKeyPair(); // 得到公匙 PublicKey pubkey = keys.getPublic(); // 得到私匙 PrivateKey prikey = keys.getPrivate(); // 将公匙私匙写入到文件当中 doObjToFile("mykeys.bat", new Object[] { prikey, pubkey }); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } /** * 利用私匙对信息进行签名 把签名后的信息放入到指定的文件中 * * @param info * 要签名的信息 * @param signfile * 存入的文件 */ public void signToInfo(String info, String signfile) { // 从文件当中读取私匙 PrivateKey myprikey = (PrivateKey) getObjFromFile("mykeys.bat", 1); // 从文件中读取公匙 PublicKey mypubkey = (PublicKey) get...

上一篇:免费办公协同软件下载 免费oa协同办公系统

下一篇:2003word文字垂直对齐 word文字垂直对齐