首先來看一段java中對字符串加解密的代碼:
//密鑰
private String key = "123456789012345678901234";
//解密過程,先用Base64進行解密,然后再用3DES進行第二次解密,得到明文
public String decryptThreeDESECB(String src) throws Exception {
DESedeKeySpec dks = new DESedeKeySpec(key.getBytes(charSet));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.DECRYPT_MODE, securekey);
byte[] retByte = cipher.doFinal(Base64.decodeBase64(src.getBytes(charSet)));
return new String(retByte,charSet);
}
//加密過程,先用3DES進行加密,然后再用Base64進行第二次加密輸出,得到密文
public String decryptThreeDESECBBYTE(byte[] EncodeByte) throws Exception {
DESedeKeySpec dks = new DESedeKeySpec(key.getBytes(charSet));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.DECRYPT_MODE, securekey);
byte[] retByte = cipher.doFinal(Base64.decodeBase64(src.getBytes(charSet)));
return new String(retByte,charSet);
}
在java中通過引入相應的庫可以輕松實現該功能,而在c++中相應的確沒有標准的庫給調用,因此還是需要理解一下DES相關的知識,再去實現代碼。
我們先來了解一下簡單的DES/3DES/AES的區別:
DES
如Mode為加密,則用Key 去把數據Data進行加密, 生成Data的密碼形式(64位)作為DES的輸出結果;
如Mode為解密,則用Key去把密碼形式的數據Data解密,還原為Data的明碼形式(64位)作為DES的輸出結果。
在通信網絡的兩端,雙方約定一致的Key,在通信的源點用Key對核心數據進行DES加密,然后以密碼形式在公共通信網(如電話網)中傳輸到通信網絡的終點,數據到達目的地后,用同樣的Key對密碼數據進行解密,便再現了明碼形式的核心數據。這樣,便保證了核心數據(如PIN、MAC等)在公共通信網中傳輸的安全性和可靠性。
通過定期在通信網絡的源端和目的端同時改用新的Key,便能更進一步提高數據的保密性,這正是現在金融交易網絡的流行做法。
3DES
3DES是DES加密算法的一種模式,它使用3條64位的密鑰對數據進行三次加密。數據加密標准(DES)是美國的一種由來已久的加密標准,它使用對稱密鑰加密法。
3DES(即Triple DES)是DES向AES過渡的加密算法(1999年,NIST將3-DES指定為過渡的加密標准),是DES的一個更安全的變形。它以DES為基本模塊,通過組合分組方法設計出分組加密算法。
設Ek()和Dk()代表DES算法的加密和解密過程,K代表DES算法使用的密鑰,P代表明文,C代表密表,這樣,
3DES加密過程為:C=Ek3(Dk2(Ek1(P)))
3DES解密過程為:P=Dk1((EK2(Dk3(C)))
K1、K2、K3決定了算法的安全性,若三個密鑰互不相同,本質上就相當於用一個長為168位的密鑰進行加密。多年來,它在對付強力攻擊時是比較安全的。若數據對安全性要求不那么高,K1可以等於K3。在這種情況下,密鑰的有效長度為112位。
AES
AES(Advanced Encryption Standard):高級加密標准,是下一代的加密算法標准,速度快,安全級別高。
用AES加密2000年10月,NIST(美國國家標准和技術協會)宣布通過從15種候選算法中選出的一項新的密匙加密標准。Rijndael被選中成為將來的 AES。Rijndael是在1999年下半年,由研究員Joan Daemen 和 Vincent Rijmen 創建的。AES正日益成為加密各種形式的電子數據的實際標准。
美國標准與技術研究院(NIST)於2002年5月26日制定了新的高級加密標准(AES)規范。
AES算法基於排列和置換運算。排列是對數據重新進行安排,置換是將一個數據單元替換為另一個。
AES使用幾種不同的方法來執行排列和置換運算。AES是一個迭代的、對稱密鑰分組的密碼,它可以使用128、192和256位密鑰,並且用128位(16字節)分組加密和解密數據。
與公共密鑰加密使用密鑰對不同,對稱密鑰密碼使用相同的密鑰加密和解密數據。通過分組密碼返回的加密數據的位數與輸入數據相同。迭代加密使用一個循環結構,在該循環中重復置換和替換輸入數據。
了解了相應的知識以后,我們再去寫相應的c++代碼。我這里有一個寫好的和上面java實現功能一樣的c++代碼,供大家參考。地址為:
http://download.csdn.net/detail/liulong371212/9391330