日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android网络传输中必用的两个加密算法:MD5 和 RSA 及Base64加密总结

發布時間:2024/4/15 Android 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android网络传输中必用的两个加密算法:MD5 和 RSA 及Base64加密总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
(1)commons-codec包簡介 包含一些通用的編碼解碼算法。包括一些語音編碼器,Hex,Base64.MD5

一、md5.base64.commons-codec包

commons-codec包可以從apache下載,最新版是1.3

不可逆算法

1.MD5

<!---->String?str?=?"abc";
DigestUtils.md5Hex(str);

附.net生成MD5的方法,生成內容跟java一致:

<!---->String?str?=?"abc";
FormsAuthentication.HashPasswordForStoringInConfigFile(str,?"MD5");

?自己寫的MD5算法:

import java.security.MessageDigest;
public class MD5Util {
public final static String getMD5String(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;
}
}
}

2.SHA1

<!---->String?str?=?"abc";
DigestUtils.shaHex(str);

附.net生成SHA1的方式,生成內容跟java一致:

<!---->String?str?=?"abc";
FormsAuthentication.HashPasswordForStoringInConfigFile(str,?"SHA1");

可逆算法

常規加密解密算法:BASE64

加密

<!---->String?str=?"abc"; // abc為要加密的字符串
byte[]?b?=?Base64.encodeBase64(str.getBytes(),?true);
System.out.println(new?String(b));

解密

<!---->String?str?=?"YWJj"; //?YWJj為要解密的字符串
byte[]?b?=?Base64.decodeBase64(str.getBytes());
System.out.println(new?String(b));

二、RSA加密

RSA是可逆的,一個字符串可以經rsa加密后,經加密后的字符串傳到對端如服務器上,再進行解密即可。前提是服務器知道解密的私鑰,當然這個私鑰最好不要再網絡傳輸。RSA算法描述中需要以下幾個變量:

1、p和q 是不相等的,足夠大的兩個質數。 p和q是保密的

2、n = p*q n是公開的

3、f(n) = (p-1)*(q-1)

4、e 是和f(n)互質的質數

5、計算參數d?

6、經過上面5步計算得到公鑰KU=(e,n) 私鑰KR=(d,n)

下面兩篇文章對此有清晰的描述:

http://wenku.baidu.com/view/e53fbe36a32d7375a417801b.html

http://bank.hexun.com/2009-06-24/118958531.html

下面是java實現RSAUtil.java類:

[java]?view plaincopyprint?
  • <span?style="font-family:Comic?Sans?MS;font-size:18px;">package?org.rsa.util;??
  • ??
  • import?javax.crypto.Cipher;??
  • import?java.security.*;??
  • import?java.security.spec.RSAPublicKeySpec;??
  • import?java.security.spec.RSAPrivateKeySpec;??
  • import?java.security.spec.InvalidKeySpecException;??
  • import?java.security.interfaces.RSAPrivateKey;??
  • import?java.security.interfaces.RSAPublicKey;??
  • import?java.io.*;??
  • import?java.math.BigInteger;??
  • ??
  • /**?
  • ?*?RSA?工具類。提供加密,解密,生成密鑰對等方法。?
  • ?*?需要到http://www.bouncycastle.org下載bcprov-jdk14-123.jar。?
  • ?*?RSA加密原理概述???
  • ?*?RSA的安全性依賴于大數的分解,公鑰和私鑰都是兩個大素數(大于100的十進制位)的函數。???
  • ?*?據猜測,從一個密鑰和密文推斷出明文的難度等同于分解兩個大素數的積???
  • ?*?===================================================================???
  • ?*?(該算法的安全性未得到理論的證明)???
  • ?*?===================================================================???
  • ?*?密鑰的產生:???
  • ?*?1.選擇兩個大素數?p,q?,計算?n=p*q;???
  • ?*?2.隨機選擇加密密鑰?e?,要求?e?和?(p-1)*(q-1)互質???
  • ?*?3.利用?Euclid?算法計算解密密鑰?d?,?使其滿足?e*d?=?1(mod(p-1)*(q-1))?(其中?n,d?也要互質)???
  • ?*?4:至此得出公鑰為?(n,e)?私鑰為?(n,d)???
  • ?*?===================================================================???
  • ?*?加解密方法:???
  • ?*?1.首先將要加密的信息?m(二進制表示)?分成等長的數據塊?m1,m2,...,mi?塊長?s(盡可能大)?,其中?2^s<n???
  • ?*?2:對應的密文是:?ci?=?mi^e(mod?n)???
  • ?*?3:解密時作如下計算:?mi?=?ci^d(mod?n)???
  • ?*?===================================================================???
  • ?*?RSA速度???
  • ?*?由于進行的都是大數計算,使得RSA最快的情況也比DES慢上100倍,無論?是軟件還是硬件實現。???
  • ?*?速度一直是RSA的缺陷。一般來說只用于少量數據?加密。??
  • ?*文件名:RSAUtil.java<br>?
  • ?*@author?董利偉<br>?
  • ?*版本:<br>?
  • ?*描述:<br>?
  • ?*創建時間:2008-9-23?下午09:58:16<br>?
  • ?*文件描述:<br>?
  • ?*修改者:<br>?
  • ?*修改日期:<br>?
  • ?*修改描述:<br>?
  • ?*/??
  • public?class?RSAUtil?{??
  • ??
  • ????//密鑰對??
  • ????private?KeyPair?keyPair?=?null;??
  • ??????
  • ????/**?
  • ?????*?初始化密鑰對?
  • ?????*/??
  • ????public?RSAUtil(){??
  • ????????try?{??
  • ????????????this.keyPair?=?this.generateKeyPair();??
  • ????????}?catch?(Exception?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????}??
  • ??????
  • ????/**?
  • ????*?生成密鑰對?
  • ????*?@return?KeyPair?
  • ????*?@throws?Exception?
  • ????*/??
  • ????private?KeyPair?generateKeyPair()?throws?Exception?{??
  • ????????try?{??
  • ????????????KeyPairGenerator?keyPairGen?=?KeyPairGenerator.getInstance("RSA",new?org.bouncycastle.jce.provider.BouncyCastleProvider());??
  • ????????????//這個值關系到塊加密的大小,可以更改,但是不要太大,否則效率會低??
  • ????????????final?int?KEY_SIZE?=?1024;??
  • ????????????keyPairGen.initialize(KEY_SIZE,?new?SecureRandom());??
  • ????????????KeyPair?keyPair?=?keyPairGen.genKeyPair();??
  • ????????????return?keyPair;??
  • ????????}?catch?(Exception?e)?{??
  • ????????????throw?new?Exception(e.getMessage());??
  • ????????}??
  • ??????
  • ????}??
  • ??
  • ????/**?
  • ????*?生成公鑰?
  • ????*?@param?modulus?
  • ????*?@param?publicExponent?
  • ????*?@return?RSAPublicKey?
  • ????*?@throws?Exception?
  • ????*/??
  • ????private?RSAPublicKey?generateRSAPublicKey(byte[]?modulus,?byte[]?publicExponent)?throws?Exception?{??
  • ??????
  • ????????KeyFactory?keyFac?=?null;??
  • ????????try?{??
  • ????????????keyFac?=?KeyFactory.getInstance("RSA",?new?org.bouncycastle.jce.provider.BouncyCastleProvider());??
  • ????????}?catch?(NoSuchAlgorithmException?ex)?{??
  • ????????throw?new?Exception(ex.getMessage());??
  • ????????}??
  • ????????RSAPublicKeySpec?pubKeySpec?=?new?RSAPublicKeySpec(new?BigInteger(modulus),?new?BigInteger(publicExponent));??
  • ????????try?{??
  • ????????????return?(RSAPublicKey)?keyFac.generatePublic(pubKeySpec);??
  • ????????}?catch?(InvalidKeySpecException?ex)?{??
  • ????????????throw?new?Exception(ex.getMessage());??
  • ????????}??
  • ??????
  • ????}??
  • ??
  • ????/**?
  • ????*?生成私鑰?
  • ????*?@param?modulus?
  • ????*?@param?privateExponent?
  • ????*?@return?RSAPrivateKey?
  • ????*?@throws?Exception?
  • ????*/??
  • ????private?RSAPrivateKey?generateRSAPrivateKey(byte[]?modulus,?byte[]?privateExponent)?throws?Exception?{??
  • ????????KeyFactory?keyFac?=?null;??
  • ????????try?{??
  • ????????????keyFac?=?KeyFactory.getInstance("RSA",?new?org.bouncycastle.jce.provider.BouncyCastleProvider());??
  • ????????}?catch?(NoSuchAlgorithmException?ex)?{??
  • ????????????throw?new?Exception(ex.getMessage());??
  • ????????}??
  • ????????RSAPrivateKeySpec?priKeySpec?=?new?RSAPrivateKeySpec(new?BigInteger(modulus),?new?BigInteger(privateExponent));??
  • ????????try?{??
  • ????????????return?(RSAPrivateKey)?keyFac.generatePrivate(priKeySpec);??
  • ????????}?catch?(InvalidKeySpecException?ex)?{??
  • ????????????throw?new?Exception(ex.getMessage());??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ????*?加密?
  • ????*?@param?key?加密的密鑰?
  • ????*?@param?data?待加密的明文數據?
  • ????*?@return?加密后的數據?
  • ????*?@throws?Exception?
  • ????*/??
  • ????public?byte[]?encrypt(Key?key,?byte[]?data)?throws?Exception?{??
  • ????????try?{??
  • ????????????Cipher?cipher?=?Cipher.getInstance("RSA",?new?org.bouncycastle.jce.provider.BouncyCastleProvider());??
  • ????????????cipher.init(Cipher.ENCRYPT_MODE,?key);??
  • ????????????//獲得加密塊大小,如:加密前數據為128個byte,而key_size=1024?加密塊大小為127?byte,加密后為128個byte;??
  • ????????????//因此共有2個加密塊,第一個127?byte第二個為1個byte??
  • ????????????int?blockSize?=?cipher.getBlockSize();??
  • ????????????int?outputSize?=?cipher.getOutputSize(data.length);//獲得加密塊加密后塊大小??
  • ????????????int?leavedSize?=?data.length?%?blockSize;??
  • ????????????int?blocksSize?=?leavedSize?!=?0???data.length?/?blockSize?+?1?:?data.length?/?blockSize;??
  • ????????????byte[]?raw?=?new?byte[outputSize?*?blocksSize];??
  • ????????????int?i?=?0;??
  • ????????????while?(data.length?-?i?*?blockSize?>?0)?{??
  • ????????????????if?(data.length?-?i?*?blockSize?>?blockSize)??
  • ????????????????cipher.doFinal(data,?i?*?blockSize,?blockSize,?raw,?i?*?outputSize);??
  • ????????????????else??
  • ????????????????cipher.doFinal(data,?i?*?blockSize,?data.length?-?i?*?blockSize,?raw,?i?*?outputSize);??
  • ????????????????//這里面doUpdate方法不可用,查看源代碼后發現每次doUpdate后并沒有什么實際動作除了把byte[]放到ByteArrayOutputStream中??
  • ????????????????//,而最后doFinal的時候才將所有的byte[]進行加密,可是到了此時加密塊大小很可能已經超出了OutputSize所以只好用dofinal方法。??
  • ????????????????i++;??
  • ????????????}??
  • ????????????return?raw;??
  • ????????}?catch?(Exception?e)?{??
  • ????????throw?new?Exception(e.getMessage());??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ????*?解密?
  • ????*?@param?key?解密的密鑰?
  • ????*?@param?raw?已經加密的數據?
  • ????*?@return?解密后的明文?
  • ????*?@throws?Exception?
  • ????*/??
  • ????public?byte[]?decrypt(Key?key,?byte[]?raw)?throws?Exception?{??
  • ????????try?{??
  • ????????????Cipher?cipher?=?Cipher.getInstance("RSA",?new?org.bouncycastle.jce.provider.BouncyCastleProvider());??
  • ????????????cipher.init(cipher.DECRYPT_MODE,?key);??
  • ????????????int?blockSize?=?cipher.getBlockSize();??
  • ????????????ByteArrayOutputStream?bout?=?new?ByteArrayOutputStream(64);??
  • ????????????int?j?=?0;??
  • ????????????while?(raw.length?-?j?*?blockSize?>?0)?{??
  • ????????????????bout.write(cipher.doFinal(raw,?j?*?blockSize,?blockSize));??
  • ????????????????j++;??
  • ????????????}??
  • ????????????return?bout.toByteArray();??
  • ????????}?catch?(Exception?e)?{??
  • ????????????throw?new?Exception(e.getMessage());??
  • ????????}??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?返回公鑰?
  • ?????*?@return?
  • ?????*?@throws?Exception??
  • ?????*/??
  • ????public?RSAPublicKey?getRSAPublicKey()?throws?Exception{??
  • ??????????
  • ????????//獲取公鑰??
  • ????????RSAPublicKey?pubKey?=?(RSAPublicKey)?keyPair.getPublic();??
  • ????????//獲取公鑰系數(字節數組形式)??
  • ????????byte[]?pubModBytes?=?pubKey.getModulus().toByteArray();??
  • ????????//返回公鑰公用指數(字節數組形式)??
  • ????????byte[]?pubPubExpBytes?=?pubKey.getPublicExponent().toByteArray();??
  • ????????//生成公鑰??
  • ????????RSAPublicKey?recoveryPubKey?=?this.generateRSAPublicKey(pubModBytes,pubPubExpBytes);??
  • ????????return?recoveryPubKey;??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?獲取私鑰?
  • ?????*?@return?
  • ?????*?@throws?Exception??
  • ?????*/??
  • ????public?RSAPrivateKey?getRSAPrivateKey()?throws?Exception{??
  • ??????????
  • ????????//獲取私鑰??
  • ????????RSAPrivateKey?priKey?=?(RSAPrivateKey)?keyPair.getPrivate();??
  • ????????//返回私鑰系數(字節數組形式)??
  • ????????byte[]?priModBytes?=?priKey.getModulus().toByteArray();??
  • ????????//返回私鑰專用指數(字節數組形式)??
  • ????????byte[]?priPriExpBytes?=?priKey.getPrivateExponent().toByteArray();??
  • ????????//生成私鑰??
  • ????????RSAPrivateKey?recoveryPriKey?=?this.generateRSAPrivateKey(priModBytes,priPriExpBytes);??
  • ????????return?recoveryPriKey;??
  • ????}??
  • ??????
  • ??????
  • ??
  • }??
  • </span>??
  • 測試代碼:

    /****************************RSA加密解密測試********************************/
    try {
    RSAUtil rsa = new RSAUtil();
    String str = "yanzi1225627";
    RSAPublicKey pubKey = rsa.getRSAPublicKey();
    RSAPrivateKey priKey = rsa.getRSAPrivateKey();
    byte[] enRsaBytes = rsa.encrypt(pubKey,str.getBytes());
    String enRsaStr = new String(enRsaBytes, "UTF-8");
    System.out.println("加密后==" + enRsaStr);
    System.out.println("解密后==" + new String(rsa.decrypt(priKey, rsa.encrypt(pubKey,str.getBytes()))));
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    下面是執行結果:

    加密后==s?ko?1@lo????BJ?iE???1Ux?Kx&??=??n
    O? ?l?>?????2r?y??8v- \A??` ????r?t3?-3y?hjL?M??Se?Z???????~?"??e??XZ?苜?
    解密后==yanzi1225627

    上面代碼需要用到一個包rsa.jar,下載鏈接及上面的測試代碼我已打包,下載鏈接見下:

    http://download.csdn.net/detail/yanzi1225627/7382263


    轉載于:https://www.cnblogs.com/melons/p/5791931.html

    總結

    以上是生活随笔為你收集整理的Android网络传输中必用的两个加密算法:MD5 和 RSA 及Base64加密总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。