您好,登錄后才能下訂單哦!
這幾天在做字段加密的內容。所以就把這部分東西簡單的了解一下。
1、首先,加密分對稱加密及不對稱加密。
對稱加密:在消息發送前使用密鑰對消息進行加密,在對方收到消息后,使用相同的密鑰進行解密。
非對稱加密:加密和解密使用不同的密鑰。通常有密鑰A和B,使用A加密得到的密文只有B可以解密(A自身也不可解)。即為私鑰和公鑰。顧名思義,私鑰加密,公鑰解密。
典型的對稱加密是DES算法,典型的非對稱加密是RSA算法。
2、這次使用了MD5和3DES,還是先對這個做一個歸納。
MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc發明,經MD2、MD3和MD4發展而來。Message-Digest,意思為報文摘要,對不定長的報文做出定長的“報文摘要”。
附代碼:
import java.security.MessageDigest; public static final String encode(String s) { char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; try { byte[] btInput = s.getBytes(); // 獲得MD5摘要算法的 MessageDigest 對象 MessageDigest mdInst = MessageDigest.getInstance("MD5"); // 使用指定的字節更新摘要 mdInst.update(btInput); // 獲得密文 byte[] md = mdInst.digest(); // 把密文轉換成十六進制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { e.printStackTrace(); return null; } }
注意:一定要在加密前,將需要加密的字符串轉為字節數組。
DES算法:是使用一個56位的密鑰以及附加的8位奇偶校驗位(每組的第8位作為奇偶校驗位),產生最大64位的分組大小。這是一個迭代的分組密碼,使用稱為Feistel的技術,其中將加密的文本塊分為兩半,使用子密鑰對其中一半應用循環功能,然后將輸出與另一半進行“異或”運算;接著交換這兩半,這一過程會繼續下去。但最后一個循環不交換。DES使用16輪循環,使用異或、置換、代換、移位操作四種基本運算。
而3DES就是對數據塊進行三次DES算法加密來進行加固。
代碼如下:
public static String COMMON_KEY = "843ce";//密鑰 public static byte[] desEncrypt(String msg, String salt) { if (msg == null) msg = ""; if (salt == null) { salt = COMMON_KEY; } byte[] keyBytes = new byte[8]; int saltLen = salt.length(); byte[] saltBytes = salt.getBytes();//轉換成字節數組,這是加密的必要步驟! for (int i = 0; i < 8; i++) { keyBytes[i] = saltBytes[i % saltLen]; } try { DESKeySpec keySpec = new DESKeySpec(keyBytes); SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(keySpec); Cipher desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); desCipher.init(Cipher.ENCRYPT_MODE, key); byte[] text = msg.getBytes("UTF-8"); byte[] ciphertext = desCipher.doFinal(text); return ciphertext; } catch (Exception e) { e.printStackTrace(); } return null; } public static String desDecrypt(byte[] msg, String salt) { if (msg == null) return null; if (salt == null) { salt = COMMON_KEY; } byte[] keyBytes = new byte[8]; int saltLen = salt.length(); byte[] saltBytes = salt.getBytes(); for (int i = 0; i < 8; i++) { keyBytes[i] = saltBytes[i % saltLen]; } try { DESKeySpec keySpec = new DESKeySpec(keyBytes); SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(keySpec); Cipher desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); desCipher.init(Cipher.DECRYPT_MODE, key); byte[] deciphertext = desCipher.doFinal(msg); return new String(deciphertext, "UTF-8"); } catch (Exception e) { e.printStackTrace(); } return null; } public static String dumpBytes(byte[] bytes) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < bytes.length; i++) { if (i % 32 == 0 && i != 0) { sb.append("\n"); } String s = Integer.toHexString(bytes[i]); if (s.length() < 2) { s = "0" + s; } if (s.length() > 2) { s = s.substring(s.length() - 2); } sb.append(s); } return sb.toString(); } public static byte[] parseBytes(String str) { try { int len = str.length() / 2; if (len <= 2) { return new byte[] { Byte.parseByte(str) }; } byte[] arr = new byte[len]; for (int i = 0; i < arr.length; i++) { arr[i] = (byte) Integer.parseInt( str.substring(i * 2, i * 2 + 2), 16); } return arr; } catch (Exception e) { return new byte[0]; } } /** * 加密 * * @param encrypt_value * 被加密的字符串 * @param encrypt_key * 加密的密鑰 * @return */ public static String encryptAsString(String encrypt_value, String encrypt_key) { return dumpBytes(desEncrypt(encrypt_value, encrypt_key)); } /** * 解密 * * @param encrypt_value * 要解密的字符串 * @param encrypt_key * 密鑰 * @return */ public static String desEncryptAsString(String encrypt_value, String encrypt_key) { return desDecrypt(parseBytes(encrypt_value), encrypt_key); }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。