溫馨提示×

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

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

MD5和3DES加密方式淺析

發(fā)布時(shí)間:2020-07-28 12:39:46 來(lái)源:網(wǎng)絡(luò) 閱讀:921 作者:曼曼曼鰻魚 欄目:開(kāi)發(fā)技術(shù)

    這幾天在做字段加密的內(nèi)容。所以就把這部分東西簡(jiǎn)單的了解一下。

1、首先,加密分對(duì)稱加密及不對(duì)稱加密。

    對(duì)稱加密:在消息發(fā)送前使用密鑰對(duì)消息進(jìn)行加密,在對(duì)方收到消息后,使用相同的密鑰進(jìn)行解密。

    非對(duì)稱加密:加密和解密使用不同的密鑰。通常有密鑰A和B,使用A加密得到的密文只有B可以解密(A自身也不可解)。即為私鑰和公鑰。顧名思義,私鑰加密,公鑰解密。

    典型的對(duì)稱加密是DES算法,典型的非對(duì)稱加密是RSA算法。


2、這次使用了MD5和3DES,還是先對(duì)這個(gè)做一個(gè)歸納。

MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室和RSA Data Security Inc發(fā)明,經(jīng)MD2、MD3和MD4發(fā)展而來(lái)。Message-Digest,意思為報(bào)文摘要,對(duì)不定長(zhǎng)的報(bào)文做出定長(zhǎng)的“報(bào)文摘要”。

附代碼:    

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 對(duì)象
MessageDigest mdInst = MessageDigest.getInstance("MD5");
// 使用指定的字節(jié)更新摘要
mdInst.update(btInput);
// 獲得密文
byte[] md = mdInst.digest();
// 把密文轉(zhuǎn)換成十六進(jìn)制的字符串形式
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;
}
}

注意:一定要在加密前,將需要加密的字符串轉(zhuǎn)為字節(jié)數(shù)組。

DES算法:是使用一個(gè)56位的密鑰以及附加的8位奇偶校驗(yàn)位(每組的第8位作為奇偶校驗(yàn)位),產(chǎn)生最大64位的分組大小。這是一個(gè)迭代的分組密碼,使用稱為Feistel的技術(shù),其中將加密的文本塊分為兩半,使用子密鑰對(duì)其中一半應(yīng)用循環(huán)功能,然后將輸出與另一半進(jìn)行“異或”運(yùn)算;接著交換這兩半,這一過(guò)程會(huì)繼續(xù)下去。但最后一個(gè)循環(huán)不交換。DES使用16輪循環(huán),使用異或、置換、代換、移位操作四種基本運(yùn)算。

而3DES就是對(duì)數(shù)據(jù)塊進(jìn)行三次DES算法加密來(lái)進(jìn)行加固。

代碼如下:

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();//轉(zhuǎn)換成字節(jié)數(shù)組,這是加密的必要步驟!
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);
}



向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