java加密解密算法_第1頁(yè)
java加密解密算法_第2頁(yè)
java加密解密算法_第3頁(yè)
java加密解密算法_第4頁(yè)
java加密解密算法_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、加密算法分類(lèi):v 只能加密:SHA MD5v 既能加密也能解密: 對(duì)稱(chēng):DES RC4 非對(duì)稱(chēng):RSA非對(duì)稱(chēng)加密技術(shù)開(kāi)銷(xiāo)比較大,不適合大文本的加密。SHA加密算法 SHA加密算法用途 數(shù)字簽名、數(shù)字時(shí)間戳、數(shù)字證書(shū) SHA加密原理以及流程在SHA1算法中,我們必須把原始 消息(字符串,文件等)轉(zhuǎn)換成位字符串位。SHA1算法只接受位作為輸入。假設(shè)我們對(duì)字符串”abc”產(chǎn)生消息摘要(也就是加密)。首先,我們將它轉(zhuǎn)換成位字符串如下:01100001 01100010 01100011a=97 b=98 c=99這個(gè)位字符串的長(zhǎng)度為24。下面我們需要5個(gè)步驟來(lái)計(jì)算SHA。1 補(bǔ)位 消息必須進(jìn)行補(bǔ)位,以

2、使其長(zhǎng)度在對(duì)512取模以后的余數(shù)是448,也就是說(shuō),(補(bǔ)位后的消息長(zhǎng)度)len%512=448。即使長(zhǎng)度已經(jīng)滿(mǎn)足對(duì)512取模后余數(shù)是448,補(bǔ)位也必須要進(jìn)行。補(bǔ)位是這樣進(jìn)行的:先補(bǔ)一個(gè)1,然后再補(bǔ)0,直到長(zhǎng)度滿(mǎn)足對(duì)512取模后余數(shù)是448.總而言之,補(bǔ)位是至少補(bǔ)一位,最多補(bǔ)512位。還是以前面的“abc”為例顯示補(bǔ)位過(guò)程。原始信息為:01100001 01100010 01100011補(bǔ)位第一步:01100001 01100010 01100011 1(首先補(bǔ)一個(gè)1)補(bǔ)位第二步:01100001 01100010 01100011 10.0(補(bǔ)423個(gè)0)2 補(bǔ)長(zhǎng)度 所謂的補(bǔ)長(zhǎng)度是將原始數(shù)據(jù)的

3、長(zhǎng)度補(bǔ)到已經(jīng)進(jìn)行了補(bǔ)位操作的消息后面。通常一個(gè)64位的數(shù)據(jù)來(lái)表示原始消息的長(zhǎng)度。在進(jìn)行了補(bǔ)長(zhǎng)度的操作以后,整個(gè)消息就變成下面這樣了。如果原始的消息長(zhǎng)度超過(guò)了512,我們需要將它補(bǔ)成512的倍數(shù)。然后我們把整個(gè)消息分成一個(gè)一個(gè)512位的數(shù)據(jù)塊,分別處理每一個(gè)數(shù)據(jù)塊,從而得到消息摘要。345 Java代碼實(shí)現(xiàn)SHA算法/*SHA(Secure Hash Algorithm,安全散列算法),數(shù)字簽名等密碼學(xué)應(yīng)用中重要的工具,被廣泛地應(yīng)用于電子商務(wù)等信息安全領(lǐng)域。雖然,SHA與MD5通過(guò)碰撞法都被破解了, 但是SHA仍然是公認(rèn)的安全加密算法,較之MD5更為安全*/public class SHAEnc

4、ode public static final String KEY_SHA = "SHA1" public static String shaDigest(byte source) throws NoSuchAlgorithmException String encrpt = null;MessageDigest md = MessageDigest.getInstance(KEY_SHA);md.update(source);/得到數(shù)據(jù)摘要byte digest = md.digest();/把二進(jìn)制數(shù)組轉(zhuǎn)換成十六進(jìn)制字符串encrpt = Byte2HexStrUti

5、l.byte2HexStr(digest);return encrpt; MD5加密算法 MD5算法java實(shí)現(xiàn) /* * 獲取加密后的字符串 * param input * return */ public static String md5Digest(String data) try / 拿到一個(gè)MD5轉(zhuǎn)換器(如果想要SHA1參數(shù)換成”SHA1”) MessageDigest messageDigest =MessageDigest.getInstance("MD5"); / 輸入的字符串轉(zhuǎn)換成字節(jié)數(shù)組 byte inputByteArray = data.getBy

6、tes(); / inputByteArray是輸入字符串轉(zhuǎn)換得到的字節(jié)數(shù)組 messageDigest.update(inputByteArray); / 轉(zhuǎn)換并返回結(jié)果,也是字節(jié)數(shù)組,包含16個(gè)元素 byte resultByteArray = messageDigest.digest(); / 字符數(shù)組轉(zhuǎn)換成字符串返回 return byteArrayToHex(resultByteArray); catch (NoSuchAlgorithmException e) return null; public static String byteArrayToHex(byte byteArr

7、ay) / 首先初始化一個(gè)字符數(shù)組,用來(lái)存放每個(gè)16進(jìn)制字符 char hexDigits = '0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F' ; / new一個(gè)字符數(shù)組,這個(gè)就是用來(lái)組成結(jié)果字符串的(解釋一下:一個(gè)byte是八位二進(jìn)制,也就是2位十六進(jìn)制字符(

8、2的8次方等于16的2次方) char resultCharArray =new charbyteArray.length * 2; / 遍歷字節(jié)數(shù)組,通過(guò)位運(yùn)算(位運(yùn)算效率高),轉(zhuǎn)換成字符放到字符數(shù)組中去 int index = 0; for (byte b : byteArray) resultCharArrayindex+ = hexDigitsb>>> 4 & 0xf; resultCharArrayindex+ = hexDigitsb& 0xf; / 字符數(shù)組組合成字符串返回 return new String(resultCharArray);

9、DES加密算法1) 要被加密的數(shù)據(jù)被分割稱(chēng)為若干以64bit為單位的數(shù)據(jù),如果位數(shù)不夠,那么補(bǔ)00或者FF,然后按照表1進(jìn)行置換操作。表1相當(dāng)于一個(gè)函數(shù)。2) 把64位密鑰按表2做置換,去除密鑰中作為奇偶校驗(yàn)位的第8、16、24、32、40、48、56、64位,剩下的56位作為有效輸入密鑰。 3)將56位有效密鑰按表3左移位,總計(jì)進(jìn)行16輪操作,每一輪移位結(jié)束之后,得 到的新的56位子密鑰作為下一輪移位的有效密鑰??傆?jì)得到16個(gè)56位的子密鑰。 4)按照表4對(duì)16個(gè)子密鑰進(jìn)行置換壓縮,壓縮后每個(gè)子密鑰中的第9,18,22,25,35,38,43,54共8位數(shù)據(jù)會(huì)丟失。此步驟完成后得到16個(gè)48

10、位的子密鑰。 5)將第一步生成的16個(gè)有效數(shù)據(jù)的右半部分R1的32位的數(shù)據(jù)根據(jù)表5進(jìn)行置換,由原32位擴(kuò)展到48位。 6) 將擴(kuò)展后的有效數(shù)據(jù)的新的R1和K1做異或運(yùn)算得到16個(gè)48位的加密數(shù)據(jù)。7) 將第六步產(chǎn)生的48位的加密數(shù)據(jù)分為8個(gè)6位的數(shù)據(jù),按照表6取值,每6位壓縮成4位,最終形成8個(gè)4位的數(shù)據(jù),組合成新的32位的數(shù)據(jù)。8) 將上步產(chǎn)生的32位的數(shù)據(jù)按照表7置換,生成新的32位的RR1數(shù)據(jù)。9) 把RR1和第一步產(chǎn)生的L【1】按位異或后的值賦給第一步產(chǎn)生的R【2】,然后原來(lái)的R【1】值賦給L【2】,得到新的L【2】和R【2】10) 回到第5步,重復(fù)運(yùn)算第9步,每輪計(jì)算由R【i】,L【

11、i】,k【i】來(lái)計(jì)算??傆?jì)16輪結(jié)束,最終生成新的L【16】和R【16】11) 合并L【16】和R【16】為64位的數(shù)據(jù),然后按照表8做置換,生成最終加密數(shù)據(jù) DES加密算法java實(shí)現(xiàn)/* * DES加密 * param source * return */public static String desEncrypt(String source)if(source = null | source.length() =0)return null;try /DES算法要求有一個(gè)可信任的隨機(jī)數(shù)源SecureRandom sr = new SecureRandom();/從原始密鑰數(shù)據(jù)創(chuàng)建一個(gè)DE

12、SKeySpec對(duì)象DESKeySpec dks = new DESKeySpec(DES_KEY.getBytes();SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");/生產(chǎn)密鑰SecretKey key = keyFactory.generateSecret(dks);/Cipher對(duì)象實(shí)際完成加密操作Cipher cipher = Cipher.getInstance("DES");/使用密鑰初始化Cipher對(duì)象cipher.init(Cipher.ENCRYPT

13、_MODE,key,sr);byte data =source.getBytes();/加密byte encryptedData = cipher.doFinal(data);/轉(zhuǎn)成16進(jìn)制串String hexString = HexUtil.byte2HexStr(encryptedData);return hexString; catch (InvalidKeyException e) e.printStackTrace(); catch (NoSuchAlgorithmException e) e.printStackTrace(); catch (InvalidKeySpecExce

14、ption e) e.printStackTrace(); catch (NoSuchPaddingException e) e.printStackTrace(); catch (IllegalBlockSizeException e) e.printStackTrace(); catch (BadPaddingException e) e.printStackTrace();return null;/* * DES解密 * param source * return */public static String desDecrypt(String source)if(source = nu

15、ll | source.length() =0)return null;try /DES算法要求有一個(gè)可信任的隨機(jī)數(shù)源SecureRandom sr = new SecureRandom();/從原始密鑰數(shù)據(jù)創(chuàng)建一個(gè)DESKeySpec對(duì)象DESKeySpec dks = new DESKeySpec(DES_KEY.getBytes();SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey key = keyFactory.generateSecret(dks);/Ciphe

16、r對(duì)象實(shí)際完成解密操作Cipher cipher = Cipher.getInstance("DES");/使用密鑰初始化Cipher對(duì)象cipher.init(Cipher.DECRYPT_MODE,key,sr);/將十六進(jìn)制串轉(zhuǎn)成字節(jié)數(shù)組byte data =HexUtil.hex2Byte(source);/解密byte decryptedData = cipher.doFinal(data);return new String(decryptedData); catch (InvalidKeyException e) e.printStackTrace(); ca

17、tch (NoSuchAlgorithmException e) e.printStackTrace(); catch (InvalidKeySpecException e) e.printStackTrace(); catch (NoSuchPaddingException e) e.printStackTrace(); catch (IllegalBlockSizeException e) e.printStackTrace(); catch (BadPaddingException e) e.printStackTrace();return null;3DES加密算法 Java實(shí)現(xiàn)3DE

18、S加密算法 1、加入bcprov-jdk16-145.jar包支持 public class ThreeDESUtil / 算法名稱(chēng) public static final String KEY_ALGORITHM = "desede" / 算法名稱(chēng)/加密模式/填充方式 public static final String CIPHER_ALGORITHM = "desede/CBC/NoPadding" /* */* * CBC加密 * param key 密鑰 * param keyiv IV * param data 明文 * return Bas

19、e64編碼的密文 * 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 IvParameterSpe

20、c(keyiv); cipher.init(Cipher.ENCRYPT_MODE, deskey, ips); byte bOut = cipher.doFinal(data); for (int k = 0; k < bOut.length; k+) System.out.print(bOutk + " "); System.out.println(""); return bOut; /* */* * * 生成密鑰key對(duì)象 * param KeyStr 密鑰字符串 * return 密鑰對(duì)象 * throws InvalidKeyExcept

21、ion * 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.getInsta

22、nce(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') & 0x0

23、f; / 從十六進(jìn)制字符串到字節(jié)數(shù)組轉(zhuǎn)換 public static byte HexString2Bytes(String hexstr) byte b = new bytehexstr.length() / 2; int j = 0; for (int i = 0; i < b.length; i+) char c0 = hexstr.charAt(j+); char c1 = hexstr.charAt(j+); bi = (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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論