从数据安全谈起


当你使用网银时,是否担心你的银行卡会被盗用?

当你和朋友用QQ进行聊天时,是否担心你的隐私会被泄露?

作为开发者,编写安全的代码比编写优雅的代码更重要,因为安全是一切应用之根本!为了确保数据不被侵犯,数据加密/解密技术运用而生。    ——摘录自《Java加密解密的艺术》

所以为了确保数据传输和数据存储的安全,我们可以通过特定的算法,将数据明文加密成复杂的密文。

众多的加密手段大致可以分为单项加密和双向加密。单项加密指通过对数据进行摘要计算生成密文,密文不可逆推还原,比如有Base64、MD5、SHA等;双向加密则相反,指可以把密文逆推还原成明文,其中双向加密又分为对称加密和非对称加密。对称加密是指数据使用者必须拥有同样的密钥才可以进行加密解密,就像大家共同约定了一组暗号一样,对称加密的手段有DES、3DES、AES、IDEA、RC4、RC5等;而非对称加密相对于对称加密而言,无需拥有同一组密钥,它是一种“信息公开的密钥交换协议”。非对称加密需要公开密钥和私有密钥两组密钥,公开密钥和私有密钥是配对起来的,也就是说使用公开密钥进行数据加密,只有对应的私有密钥才能进行解密。此类的加密手段有RSA、DSA等。

【密码学常用术语】

明文:未加密的数据

密文:明文经过加密后的数据

加密:将明文转换为密文的过程

解密:将密文转换为明文的过程

加密算法:将明文转换为密文的转换算法

解密算法:将密文转换为明文的转换算法

加密密钥:用于加密算法进行加密操作的密钥

解密密钥:用于解密算法进行解密操作的密钥

初识3DES


3DES,也称为3DESede或TripleDES,是三重数据加密,且可以逆推的一种算法方案。

1975年美国IBM公司成功研究并发布了DES加密算法,但DES密码长度容易被暴力破解,通过对DES算法进行改进,针对每个数据块进行三次DES加密,也就是3DES加密算法。

但由于3DES的算法是公开的,所以算法本身没什么秘密可言,主要依靠唯一密钥来确保数据加密解密的安全。

有人可能会问,那3DES到底安不安全呢?!目前为止,还没有人能破解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);

3DES案例


—SecretUtils.java(3DES加密解密的工具类)—

1 package my3des;2  3 import java.io.UnsupportedEncodingException;4  5 import javax.crypto.Cipher;6 import javax.crypto.SecretKey;7 import javax.crypto.spec.SecretKeySpec;8  9
10 /**
11  * SecretUtils {3DES加密解密的工具类 }
12  * @author liuyinfei
13  * @date 2018-08-19
14  */
15 public class SecretUtils {
16
17     //定义加密算法,有DES、DESede(即3DES)、Blowfish
18     private static final String Algorithm = "DESede";
19     private static final String PASSWORD_CRYPT_KEY = "2012PinganVitality075522628888ForShenZhenBelter075561869839";
20
21
22     /**
23      * 加密方法
24      * @param src 源数据的字节数组
25      * @return
26      */
27     public static byte[] encryptMode(byte[] src) {
28         try {
29              SecretKey deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);    //生成密钥
30              Cipher c1 = Cipher.getInstance(Algorithm);    //实例化负责加密/解密的Cipher工具类
31              c1.init(Cipher.ENCRYPT_MODE, deskey);    //初始化为加密模式
32              return c1.doFinal(src);
33          } catch (java.security.NoSuchAlgorithmException e1) {
34              e1.printStackTrace();
35          } catch (javax.crypto.NoSuchPaddingException e2) {
36              e2.printStackTrace();
37          } catch (java.lang.Exception e3) {
38              e3.printStackTrace();
39          }
40          return null;
41      }
42
43
44     /**
45      * 解密函数
46      * @param src 密文的字节数组
47      * @return
48      */
49     public static byte[] decryptMode(byte[] src) {
50         try {
51             SecretKey deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);
52             Cipher c1 = Cipher.getInstance(Algorithm);
53             c1.init(Cipher.DECRYPT_MODE, deskey);    //初始化为解密模式
54             return c1.doFinal(src);
55         } catch (java.security.NoSuchAlgorithmException e1) {
56             e1.printStackTrace();
57         } catch (javax.crypto.NoSuchPaddingException e2) {
58             e2.printStackTrace();
59         } catch (java.lang.Exception e3) {
60             e3.printStackTrace();
61         }
62         return null;
63      }
64
65
66     /*
67      * 根据字符串生成密钥字节数组
68      * @param keyStr 密钥字符串
69      * @return
70      * @throws UnsupportedEncodingException
71      */
72     public static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException{
73         byte[] key = new byte[24];    //声明一个24位的字节数组,默认里面都是0
74         byte[] temp = keyStr.getBytes("UTF-8");    //将字符串转成字节数组
75
76         /*
77          * 执行数组拷贝
78          * System.arraycopy(源数组,从源数组哪里开始拷贝,目标数组,拷贝多少位)
79          */
80         if(key.length > temp.length){
81             //如果temp不够24位,则拷贝temp数组整个长度的内容到key数组中
82             System.arraycopy(temp, 0, key, 0, temp.length);
83         }else{
84             //如果temp大于24位,则拷贝temp数组24个长度的内容到key数组中
85             System.arraycopy(temp, 0, key, 0, key.length);
86         }
87         return key;
88     }
89 }

—Main.java(测试类)—

1 package my3des;2  3 public class Main {4  5     /**6      * @param args7      */8     public static void main(String[] args) {9         String msg = "3DES加密解密案例";
10         System.out.println("【加密前】:" + msg);
11
12         //加密
13         byte[] secretArr = SecretUtils.encryptMode(msg.getBytes());
14         System.out.println("【加密后】:" + new String(secretArr));
15
16         //解密
17         byte[] myMsgArr = SecretUtils.decryptMode(secretArr);
18         System.out.println("【解密后】:" + new String(myMsgArr));
19     }
20 }

补充说明


· 3DES的密钥必须是24位的byte数组

随便拿一个String.getBytes()是不行的,会报如下错误

java.security.InvalidKeyException: Invalid key length: 59 bytes

解决方法有很多,①按密钥固定长度重新定义字符串;②先把字符串用Base64或者MD5加密,然后截取固定长度的字符转成byte数组;③字符串转成Byte数组,针对该数组进行修改,若长度过长则只截取一部分,若长度不够则补零

· 加密结果的编码方式要一致

从byte数组转成字符串,一般有两种方式,base64处理和十六进制处理。

· 参考资料

3DES在线测试工具:http://tool.chacuo.net/crypt3des

3DES

package test;import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.security.spec.InvalidKeySpecException;import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;public class ThreeDESUtil {// 算法名称 public static final String KEY_ALGORITHM = "desede";// 算法名称/加密模式/填充方式 public static final String CIPHER_ALGORITHM = "desede/CBC/NoPadding";/** * CBC加密 * @param key 密钥 * @param keyiv IV * @param data 明文 * @return Base64编码的密文 * @throws Exception */public static byte[] des3EncodeCBC(byte[] key, byte[] keyiv, byte[] data) throws Exception {Security.addProvider(new BouncyCastleProvider()); Key deskey = keyGenerator(new String(key));Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);IvParameterSpec ips = new IvParameterSpec(keyiv);cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);byte[] bOut = cipher.doFinal(data);for (int k = 0; k < bOut.length; k++) {//System.out.print(bOut[k] + " ");}//System.out.println("");return bOut;}/** *   * 生成密钥key对象 * @param KeyStr 密钥字符串 * @return 密钥对象 * @throws InvalidKeyException   * @throws NoSuchAlgorithmException   * @throws InvalidKeySpecException   * @throws Exception */private static Key keyGenerator(String keyStr) throws Exception {byte input[] = HexString2Bytes(keyStr);DESedeKeySpec KeySpec = new DESedeKeySpec(input);SecretKeyFactory KeyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);return ((Key) (KeyFactory.generateSecret(((java.security.spec.KeySpec) (KeySpec)))));}private static int parse(char c) {if (c >= 'a') return (c - 'a' + 10) & 0x0f;if (c >= 'A') return (c - 'A' + 10) & 0x0f;return (c - '0') & 0x0f;}// 从十六进制字符串到字节数组转换 public static byte[] HexString2Bytes(String hexstr) {byte[] b = new byte[hexstr.length() / 2];int j = 0;for (int i = 0; i < b.length; i++) {char c0 = hexstr.charAt(j++);char c1 = hexstr.charAt(j++);b[i] = (byte) ((parse(c0) << 4) | parse(c1));}return b;}/** * CBC解密 * @param key 密钥 * @param keyiv IV * @param data Base64编码的密文 * @return 明文 * @throws Exception */public static byte[] des3DecodeCBC(byte[] key, byte[] keyiv, byte[] data) throws Exception {Key deskey = keyGenerator(new String(key));Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);IvParameterSpec ips = new IvParameterSpec(keyiv);cipher.init(Cipher.DECRYPT_MODE, deskey, ips);byte[] bOut = cipher.doFinal(data);return bOut;}public static void main(String[] args) throws Exception {byte[] key = "6C4E60E55552386C759569836DC0F83869836DC0F838C0F7".getBytes();byte[] keyiv = { 1, 2, 3, 4, 5, 6, 7, 8};byte[] data = "aaaaaaaa".getBytes("UTF-8");System.out.println("data.length=" + data.length);System.out.println("CBC加密解密");byte[] str5 = des3EncodeCBC(key, keyiv, data);// System.out.println(new sun.misc.BASE64Encoder().encode(str5));System.out.println(new Base64().encodeToString(str5));byte[] str6 = des3DecodeCBC(key, keyiv, str5);System.out.println(new String(str6, "UTF-8"));}
}

DES:

package test;import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;import org.apache.commons.codec.binary.Base64;public class DESUtil {//算法名称 public static final String KEY_ALGORITHM = "DES";//算法名称/加密模式/填充方式 //DES共有四种工作模式-->>ECB:电子密码本模式、CBC:加密分组链接模式、CFB:加密反馈模式、OFB:输出反馈模式public static final String CIPHER_ALGORITHM = "DES/ECB/NoPadding";/***   * 生成密钥key对象* @param KeyStr 密钥字符串 * @return 密钥对象 * @throws InvalidKeyException   * @throws NoSuchAlgorithmException   * @throws InvalidKeySpecException   * @throws Exception */private static SecretKey keyGenerator(String keyStr) throws Exception {byte input[] = HexString2Bytes(keyStr);DESKeySpec desKey = new DESKeySpec(input);//创建一个密匙工厂,然后用它把DESKeySpec转换成SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey securekey = keyFactory.generateSecret(desKey);return securekey;}private static int parse(char c) {if (c >= 'a') return (c - 'a' + 10) & 0x0f;if (c >= 'A') return (c - 'A' + 10) & 0x0f;return (c - '0') & 0x0f;}// 从十六进制字符串到字节数组转换 public static byte[] HexString2Bytes(String hexstr) {byte[] b = new byte[hexstr.length() / 2];int j = 0;for (int i = 0; i < b.length; i++) {char c0 = hexstr.charAt(j++);char c1 = hexstr.charAt(j++);b[i] = (byte) ((parse(c0) << 4) | parse(c1));}return b;}/** * 加密数据* @param data 待加密数据* @param key 密钥* @return 加密后的数据 */public static String encrypt(String data, String key) throws Exception {Key deskey = keyGenerator(key);// 实例化Cipher对象,它用于完成实际的加密操作Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);SecureRandom random = new SecureRandom();// 初始化Cipher对象,设置为加密模式cipher.init(Cipher.ENCRYPT_MODE, deskey, random);byte[] results = cipher.doFinal(data.getBytes());// 该部分是为了与加解密在线测试网站(http://tripledes.online-domain-tools.com/)的十六进制结果进行核对for (int i = 0; i < results.length; i++) {System.out.print(results[i] + " ");}System.out.println();// 执行加密操作。加密后的结果通常都会用Base64编码进行传输 return Base64.encodeBase64String(results);}/** * 解密数据 * @param data 待解密数据 * @param key 密钥 * @return 解密后的数据 */public static String decrypt(String data, String key) throws Exception {Key deskey = keyGenerator(key);Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);//初始化Cipher对象,设置为解密模式cipher.init(Cipher.DECRYPT_MODE, deskey);// 执行解密操作return new String(cipher.doFinal(Base64.decodeBase64(data)));}public static void main(String[] args) throws Exception {String source = "amigoxie";System.out.println("原文: " + source);String key = "A1B2C3D4E5F60708";String encryptData = encrypt(source, key);System.out.println("加密后: " + encryptData);String decryptData = decrypt(encryptData, key);System.out.println("解密后: " + decryptData);}
}

国密MS4:

package test;import java.util.Arrays;public class SMS4 {private static final int ENCRYPT=1;private static final int DECRYPT=0;public static final int ROUND=32;private static final int BLOCK=16;private byte[] Sbox={(byte) 0xd6,(byte) 0x90,(byte) 0xe9,(byte) 0xfe,(byte) 0xcc,(byte) 0xe1,0x3d,(byte) 0xb7,0x16,(byte) 0xb6,0x14,(byte) 0xc2,0x28,(byte) 0xfb,0x2c,0x05,0x2b,0x67,(byte) 0x9a,0x76,0x2a,(byte) 0xbe,0x04,(byte) 0xc3,(byte) 0xaa,0x44,0x13,0x26,0x49,(byte) 0x86,0x06,(byte) 0x99,(byte) 0x9c,0x42,0x50,(byte) 0xf4,(byte) 0x91,(byte) 0xef,(byte) 0x98,0x7a,0x33,0x54,0x0b,0x43,(byte) 0xed,(byte) 0xcf,(byte) 0xac,0x62,(byte) 0xe4,(byte) 0xb3,0x1c,(byte) 0xa9,(byte) 0xc9,0x08,(byte) 0xe8,(byte) 0x95,(byte) 0x80,(byte) 0xdf,(byte) 0x94,(byte) 0xfa,0x75,(byte) 0x8f,0x3f,(byte) 0xa6,0x47,0x07,(byte) 0xa7,(byte) 0xfc,(byte) 0xf3,0x73,0x17,(byte) 0xba,(byte) 0x83,0x59,0x3c,0x19,(byte) 0xe6,(byte) 0x85,0x4f,(byte) 0xa8,0x68,0x6b,(byte) 0x81,(byte) 0xb2,0x71,0x64,(byte) 0xda,(byte) 0x8b,(byte) 0xf8,(byte) 0xeb,0x0f,0x4b,0x70,0x56,(byte) 0x9d,0x35,0x1e,0x24,0x0e,0x5e,0x63,0x58,(byte) 0xd1,(byte) 0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,(byte) 0x87,(byte) 0xd4,0x00,0x46,0x57,(byte) 0x9f,(byte) 0xd3,0x27,0x52,0x4c,0x36,0x02,(byte) 0xe7,(byte) 0xa0,(byte) 0xc4,(byte) 0xc8,(byte) 0x9e,(byte) 0xea,(byte) 0xbf,(byte) 0x8a,(byte) 0xd2,0x40,(byte) 0xc7,0x38,(byte) 0xb5,(byte) 0xa3,(byte) 0xf7,(byte) 0xf2,(byte) 0xce,(byte) 0xf9,0x61,0x15,(byte) 0xa1,(byte) 0xe0,(byte) 0xae,0x5d,(byte) 0xa4,(byte) 0x9b,0x34,0x1a,0x55,(byte) 0xad,(byte) 0x93,0x32,0x30,(byte) 0xf5,(byte) 0x8c,(byte) 0xb1,(byte) 0xe3,0x1d,(byte) 0xf6,(byte) 0xe2,0x2e,(byte) 0x82,0x66,(byte) 0xca,0x60,(byte) 0xc0,0x29,0x23,(byte) 0xab,0x0d,0x53,0x4e,0x6f,(byte) 0xd5,(byte) 0xdb,0x37,0x45,(byte) 0xde,(byte) 0xfd,(byte) 0x8e,0x2f,0x03,(byte) 0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51,(byte) 0x8d,0x1b,(byte) 0xaf,(byte) 0x92,(byte) 0xbb,(byte) 0xdd,(byte) 0xbc,0x7f,0x11,(byte) 0xd9,0x5c,0x41,0x1f,0x10,0x5a,(byte) 0xd8,0x0a,(byte) 0xc1,0x31,(byte) 0x88,(byte) 0xa5,(byte) 0xcd,0x7b,(byte) 0xbd,0x2d,0x74,(byte) 0xd0,0x12,(byte) 0xb8,(byte) 0xe5,(byte) 0xb4,(byte) 0xb0,(byte) 0x89,0x69,(byte) 0x97,0x4a,0x0c,(byte) 0x96,0x77,0x7e,0x65,(byte) 0xb9,(byte) 0xf1,0x09,(byte) 0xc5,0x6e,(byte) 0xc6,(byte) 0x84,0x18,(byte) 0xf0,0x7d,(byte) 0xec,0x3a,(byte) 0xdc,0x4d,0x20,0x79,(byte) 0xee,0x5f,0x3e,(byte) 0xd7,(byte) 0xcb,0x39,0x48};private int[] CK={0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279};private int Rotl(int x,int y){return x<<y|x>>>(32-y);}private int ByteSub(int A){return (Sbox[A>>>24&0xFF]&0xFF)<<24|(Sbox[A>>>16&0xFF]&0xFF)<<16|(Sbox[A>>>8&0xFF]&0xFF)<<8|(Sbox[A&0xFF]&0xFF);}private int L1(int B){return B^Rotl(B,2)^Rotl(B,10)^Rotl(B,18)^Rotl(B,24);//   return B^(B<<2|B>>>30)^(B<<10|B>>>22)^(B<<18|B>>>14)^(B<<24|B>>>8);}private int L2(int B){return B^Rotl(B,13)^Rotl(B,23);// return B^(B<<13|B>>>19)^(B<<23|B>>>9);}void SMS4Crypt(byte[] Input,byte[] Output,int[] rk){int r,mid,x0,x1,x2,x3;int[] x= new int[4];int[] tmp = new int[4];for(int i=0;i<4;i++){tmp[0]=Input[0+4*i]&0xff;tmp[1]=Input[1+4*i]&0xff;tmp[2]=Input[2+4*i]&0xff;tmp[3]=Input[3+4*i]&0xff;x[i]=tmp[0]<<24|tmp[1]<<16|tmp[2]<<8|tmp[3];//    x[i]=(Input[0+4*i]<<24|Input[1+4*i]<<16|Input[2+4*i]<<8|Input[3+4*i]);}for(r=0;r<32;r+=4){mid=x[1]^x[2]^x[3]^rk[r+0];mid=ByteSub(mid);x[0]=x[0]^L1(mid);   //x4mid=x[2]^x[3]^x[0]^rk[r+1];mid=ByteSub(mid);x[1]=x[1]^L1(mid);  //x5mid=x[3]^x[0]^x[1]^rk[r+2];mid=ByteSub(mid);x[2]=x[2]^L1(mid);  //x6mid=x[0]^x[1]^x[2]^rk[r+3];mid=ByteSub(mid);x[3]=x[3]^L1(mid);  //x7}//Reversefor(int j=0;j<16;j+=4){Output[j]  =(byte) (x[3-j/4]>>>24&0xFF);Output[j+1]=(byte) (x[3-j/4]>>>16&0xFF);Output[j+2]=(byte) (x[3-j/4]>>>8&0xFF);Output[j+3]=(byte) (x[3-j/4]&0xFF);}}private void SMS4KeyExt(byte[] Key,int[] rk,int CryptFlag){int r,mid;int[] x= new int[4];int[] tmp =new int[4];for(int i=0;i<4;i++){tmp[0]=Key[0+4*i]&0xFF;tmp[1]=Key[1+4*i]&0xff;tmp[2]=Key[2+4*i]&0xff;tmp[3]=Key[3+4*i]&0xff;x[i]=tmp[0]<<24|tmp[1]<<16|tmp[2]<<8|tmp[3];//  x[i]=Key[0+4*i]<<24|Key[1+4*i]<<16|Key[2+4*i]<<8|Key[3+4*i];}x[0]^=0xa3b1bac6;x[1]^=0x56aa3350;x[2]^=0x677d9197;x[3]^=0xb27022dc;for(r=0;r<32;r+=4){mid=x[1]^x[2]^x[3]^CK[r+0];mid=ByteSub(mid);rk[r+0]=x[0]^=L2(mid);       //rk0=K4mid=x[2]^x[3]^x[0]^CK[r+1];mid=ByteSub(mid);rk[r+1]=x[1]^=L2(mid);       //rk1=K5mid=x[3]^x[0]^x[1]^CK[r+2];mid=ByteSub(mid);rk[r+2]=x[2]^=L2(mid);       //rk2=K6mid=x[0]^x[1]^x[2]^CK[r+3];mid=ByteSub(mid);rk[r+3]=x[3]^=L2(mid);       //rk3=K7}//rk31,rk30,...,rk0if(CryptFlag==DECRYPT){for(r=0;r<16;r++){mid=rk[r];rk[r]=rk[31-r];rk[31-r]=mid;}}}public int sms4(byte[] in,int inLen,byte[] key,byte[] out,int CryptFlag){int point=0;int[] round_key=new int[ROUND]; //int[] round_key={0};SMS4KeyExt(key,round_key,CryptFlag);byte[] input = new byte[16];byte[] output = new byte[16];while(inLen>=BLOCK){input=Arrays.copyOfRange(in, point, point+16);//   output=Arrays.copyOfRange(out, point, point+16);SMS4Crypt(input,output,round_key);System.arraycopy(output, 0, out, point, BLOCK);inLen-=BLOCK;point+=BLOCK;}return 0;}
}

3DES加密解密方法相关推荐

  1. java 3des加密_Java使用3DES加密解密的流程 - 3des加密解密详细解释

    Java使用3DES加密解密的流程 ①传入共同约定的密钥(keyBytes)以及算法(Algorithm),来构建SecretKey密钥对象 SecretKey deskey = new Secret ...

  2. iOS 3DES加密解密(一行代码搞定)

    3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...

  3. 一行代码实现IOS 3DES加密解密

    3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...

  4. 简进祥==iOS 3DES加密解密

    3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...

  5. java 3des_如何用Java进行3DES加密解密 java实现3des加密解密教程

    3des,全称为3DESede或TripleDES,中文解释为是三重数据加密,用户可以通过通过对DES算法进行改进,针对每个数据块进行三次DES加密,下面小编为你带来java实现3des加密解密教程! ...

  6. java之php、Android、JAVA、C# 3DES加密解密

    异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...

  7. python实现加密字符串_Python实现对字符串的加密解密方法示例

    本文实例讲述了Python实现对字符串的加密解密方法.分享给大家供大家参考,具体如下: 需求是是要将密码存在数据库里,所以要加密解密是可逆的,在数据库里不要有特殊字符,防止数据库备份和恢复中出错. 安 ...

  8. ios常见加密解密方法

    在其他平台中经常会计算MD5值,在ios平台中也提供了该方法,首先需要导入头文件 [cpp] view plaincopy #import <CommonCrypto/CommonDigest. ...

  9. python des解密_python实现DES加密解密方法实例详解

    本文实例讲述了python实现DES加密解密方法.分享给大家供大家参考.具体分析如下: 实现功能:加密中文等字符串 密钥与明文可以不等长 这里只贴代码,加密过程可以自己百度,此处python代码没有优 ...

  10. python如何加密字符串_Python实现对字符串的加密解密方法示例

    本文实例讲述了Python实现对字符串的加密解密方法.分享给大家供大家参考,具体如下: 需求是是要将密码存在数据库里,所以要加密解密是可逆的,在数据库里不要有特殊字符,防止数据库备份和恢复中出错. 安 ...

最新文章

  1. golang 调用c代码
  2. LeetCode Maximum Subarray
  3. 设置同一Label内涵不同颜色字体
  4. 【攻防世界003】re-for-50-plz-50
  5. windows系统和linux系统可以使用相同的js代码吗_使用Sboxr自动发现和利用DOM(客户端)XSS漏洞...
  6. mysql字符集调整总结
  7. Jira 随便总结
  8. Notepad++如何对比文件 Notepad++对比两个文件代码方法
  9. js 匿名函数_JS箭头函数三连问:为何用、怎么用、何时用
  10. Revit 2021 族样板下载
  11. Spss的基本方法使用步骤
  12. AD22如何添加元器件库
  13. 提取多个文件夹图片到一个文件夹
  14. python 查找excel内容所在的单元格_python 读取excel中单元格的内容
  15. 【Unity】漂浮文字
  16. Linux 查找内容包含某字段的文件
  17. Pygame开发Flappy Bird小游戏(上)
  18. 仿真用计算机配置,需要进行仿真,选什么配置的电脑比较好
  19. 导入Excel文件的各种常见方法
  20. 中国监控电路市场深度研究分析报告

热门文章

  1. word里面怎样输入空白下划线
  2. wieshark导出ftp文件_【FTP】Wireshark学习FTP流程
  3. php 微信公号授权登入,WordPress 微信公众号授权登录
  4. Linux正则表达式详解
  5. 台式计算机时间不能同步,电脑时间不能同步的原因和图文解决方法
  6. 基于知识图谱的智能问答项目
  7. 网赚项目:揭秘闲鱼项目,信息差赚钱新手也能日入200+
  8. c语言的log算法实现,C语言中有关log函数的算法
  9. 【MapReduce】猫眼电影数据库传输数据
  10. perl uc,lc,ucfirst,lcfirst的用法