溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java常用加密算法實(shí)例總結(jié)

發(fā)布時(shí)間:2020-09-20 21:56:03 來(lái)源:腳本之家 閱讀:157 作者:wz_微臣 欄目:編程語(yǔ)言

本文實(shí)例總結(jié)了Java常用加密算法。分享給大家供大家參考,具體如下:

項(xiàng)目中第一次深入地了解到加密算法的使用,現(xiàn)第一階段結(jié)束,將使用到的加密算法和大家分享一下:

首先還是先給大家普及一下常用加密算法的基礎(chǔ)知識(shí)

基本的單向加密算法

BASE64 嚴(yán)格地說(shuō),屬于編碼格式,而非加密算法
MD5(Message Digest algorithm 5,信息摘要算法)
SHA(Secure Hash Algorithm,安全散列算法)

復(fù)雜的加密算法

RSA(算法的名字以發(fā)明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
DES/3DES(Digital Signature Algorithm,數(shù)字簽名)

國(guó)密算法

SM2/SM4(是由國(guó)家密碼管理局編制的一種商用密碼分組標(biāo)準(zhǔn)對(duì)稱(chēng)算法)

使用方法:

base64

public static byte[] encode2Base64(byte[] bytes) {
    byte[] bts = Base64.encodeBase64(bytes);
    return bts;
}
public static byte[] decode2Base64(String str) {
    byte[] bts = Base64.decodeBase64(str);
    return bts;
}

MD5

public static String md5(String str) {
    try {
      MessageDigest digest = MessageDigest.getInstance("MD5");
      return new String(digest.digest(str.getBytes()));
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }
    return "";
}

SHA-1

public static byte[] sha1ToBytes(String str) {
    try {
      MessageDigest digest = MessageDigest.getInstance("SHA-1");
      byte[] bts = digest.digest(str.getBytes());
      return bts;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
}

DES/3DES

public static byte[] encryptMode(String keyStr, byte[] src) {
    try {
      // 生成密鑰
      SecretKey deskey = new SecretKeySpec(keyStr.getBytes(), "DESede");
      // 加密
      Cipher c1 = Cipher.getInstance("DESede");
      c1.init(Cipher.ENCRYPT_MODE, deskey);
      return c1.doFinal(src);
    } catch (java.security.NoSuchAlgorithmException e1) {
      e1.printStackTrace();
    } catch (javax.crypto.NoSuchPaddingException e2) {
      e2.printStackTrace();
    } catch (java.lang.Exception e3) {
      e3.printStackTrace();
    }
    return null;
}
public static byte[] decryptMode(String keyStr, byte[] src) {
    try {
      SecretKey deskey = new SecretKeySpec(keyStr.getBytes(), "DESede");
      // 解密
      Cipher c1 = Cipher.getInstance("DESede");
      c1.init(Cipher.DECRYPT_MODE, deskey);
      return c1.doFinal(src);
    } catch (java.security.NoSuchAlgorithmException e1) {
      e1.printStackTrace();
    } catch (javax.crypto.NoSuchPaddingException e2) {
      e2.printStackTrace();
    } catch (java.lang.Exception e3) {
      e3.printStackTrace();
    }
    return null;
}

RSA

/**
* 初始化公密鑰
* 
* @return
* @throws Exception
*/
public static Map<String, Object> initKey() throws Exception {
    KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA");
    kpGenerator.initialize(2048);
    KeyPair keyPair = kpGenerator.generateKeyPair();
    // 存儲(chǔ)公鑰
    PublicKey publicKey = keyPair.getPublic();
    // 存儲(chǔ)密鑰
    PrivateKey privateKey = keyPair.getPrivate();
    Map<String, Object> keyMap = new HashMap<String, Object>();
    keyMap.put(PUBLIC_KEY, publicKey);
    keyMap.put(PRIVATE_KEY, privateKey);
    return keyMap;
}
/**
* 取出公鑰
* 
* @param keyMap
* @return
*/
public static String getPublicKey(Map<String, Object> keyMap) {
    Key key = (Key) keyMap.get("RSAPublicKey");
    return encode2Base64(new String(key.getEncoded()));
}
/**
* 取出密鑰
* 
* @param keyMap
* @return
*/
public static String getPrivateKey(Map<String, Object> keyMap) {
    Key key = (Key) keyMap.get("RSAPrivateKey");
    return encode2Base64(new String(key.getEncoded()));
}
/**
* 公鑰加密
* 
* @param data
* @param publicKey
* @return
* @throws Exception
*/
public static String encryptByPublicKey(String data, RSAPublicKey publicKey)
  throws Exception {
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    // 模長(zhǎng)
    int key_len = publicKey.getModulus().bitLength() / 8;
    // 加密數(shù)據(jù)長(zhǎng)度 <= 模長(zhǎng)-11
    String[] datas = splitString(data, key_len - 11);
    String mi = "";
    // 如果明文長(zhǎng)度大于模長(zhǎng)-11則要分組加密
    for (String s : datas) {
      mi += bcd2Str(cipher.doFinal(s.getBytes()));
    }
    return mi;
}
/**
* 私鑰加密
* 
* @param data
* @param privateKey
* @return
* @throws Exception
*/
public static String encryptByPrivateKey(String data,
  RSAPrivateKey privateKey) throws Exception {
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, privateKey);
    // 模長(zhǎng)
    int key_len = privateKey.getModulus().bitLength() / 8;
    // 加密數(shù)據(jù)長(zhǎng)度 <= 模長(zhǎng)-11
    String[] datas = splitString(data, key_len - 11);
    String mi = "";
    // 如果明文長(zhǎng)度大于模長(zhǎng)-11則要分組加密
    for (String s : datas) {
      mi += bcd2Str(cipher.doFinal(s.getBytes()));
    }
    return mi;
}
/**
* 私鑰解密
* 
* @param data
* @param privateKey
* @return
* @throws Exception
*/
public static String decryptByPrivateKey(String data,
  RSAPrivateKey privateKey) throws Exception {
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, privateKey);
    // 模長(zhǎng)
    int key_len = privateKey.getModulus().bitLength() / 8;
    byte[] bytes = data.getBytes();
    byte[] bcd = ASCII_To_BCD(bytes, bytes.length);
    System.err.println(bcd.length);
    // 如果密文長(zhǎng)度大于模長(zhǎng)則要分組解密
    String ming = "";
    byte[][] arrays = splitArray(bcd, key_len);
    for (byte[] arr : arrays) {
      ming += new String(cipher.doFinal(arr));
    }
    return ming;
}
/**
* ASCII碼轉(zhuǎn)BCD碼
* 
*/
public static byte[] ASCII_To_BCD(byte[] ascii, int asc_len) {
    byte[] bcd = new byte[asc_len / 2];
    int j = 0;
    for (int i = 0; i < (asc_len + 1) / 2; i++) {
      bcd[i] = asc_to_bcd(ascii[j++]);
      bcd[i] = (byte) (((j >= asc_len) ? 0x00 : asc_to_bcd(ascii[j++])) + (bcd[i] << 4));
    }
    return bcd;
}
public static byte asc_to_bcd(byte asc) {
    byte bcd;
    if ((asc >= '0') && (asc <= '9'))
      bcd = (byte) (asc - '0');
    else if ((asc >= 'A') && (asc <= 'F'))
      bcd = (byte) (asc - 'A' + 10);
    else if ((asc >= 'a') && (asc <= 'f'))
      bcd = (byte) (asc - 'a' + 10);
    else
      bcd = (byte) (asc - 48);
    return bcd;
}
/**
* BCD轉(zhuǎn)字符串
*/
public static String bcd2Str(byte[] bytes) {
    char temp[] = new char[bytes.length * 2], val;
    for (int i = 0; i < bytes.length; i++) {
      val = (char) (((bytes[i] & 0xf0) >> 4) & 0x0f);
      temp[i * 2] = (char) (val > 9 ? val + 'A' - 10 : val + '0');
      val = (char) (bytes[i] & 0x0f);
      temp[i * 2 + 1] = (char) (val > 9 ? val + 'A' - 10 : val + '0');
    }
    return new String(temp);
}
/**
* 拆分字符串
*/
public static String[] splitString(String string, int len) {
    int x = string.length() / len;
    int y = string.length() % len;
    int z = 0;
    if (y != 0) {
      z = 1;
    }
    String[] strings = new String[x + z];
    String str = "";
    for (int i = 0; i < x + z; i++) {
      if (i == x + z - 1 && y != 0) {
        str = string.substring(i * len, i * len + y);
      } else {
        str = string.substring(i * len, i * len + len);
      }
      strings[i] = str;
    }
    return strings;
}
/**
* 拆分?jǐn)?shù)組
*/
public static byte[][] splitArray(byte[] data, int len) {
    int x = data.length / len;
    int y = data.length % len;
    int z = 0;
    if (y != 0) {
      z = 1;
    }
    byte[][] arrays = new byte[x + z][];
    byte[] arr;
    for (int i = 0; i < x + z; i++) {
      arr = new byte[len];
      if (i == x + z - 1 && y != 0) {
        System.arraycopy(data, i * len, arr, 0, y);
      } else {
        System.arraycopy(data, i * len, arr, 0, len);
      }
      arrays[i] = arr;
    }
    return arrays;
}

以上就是本次項(xiàng)目中用到的加密算法,需要注意的是編碼格式一定要雙方統(tǒng)一 ,如果不一致則加解密不成功。

PS:關(guān)于加密解密感興趣的朋友還可以參考本站在線(xiàn)工具:

文字在線(xiàn)加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_encode

MD5在線(xiàn)加密工具:
http://tools.jb51.net/password/CreateMD5Password

在線(xiàn)散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt

在線(xiàn)MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha

在線(xiàn)sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode

更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Java數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java字符與字符串操作技巧總結(jié)》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》和《Java緩存操作技巧匯總》

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI