(1)commons-codec包簡(jiǎn)介
包含一些通用的編碼解碼算法。包括一些語音編碼器,Hex,Base64.MD5 一、md5.base64.commons-codec包
commons-codec包可以從apache下載,最新版是1.3
不可逆算法
1.MD5
<!---->String?str?=?"abc";
DigestUtils.md5Hex(str);
附.net生成MD5的方法,生成內(nèi)容跟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 對(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;
}
}
}
2.SHA1
<!---->String?str?=?"abc";
DigestUtils.shaHex(str);
附.net生成SHA1的方式,生成內(nèi)容跟java一致:
<!---->
String?str?=?"abc";
FormsAuthentication.HashPasswordForStoringInConfigFile(str,?"SHA1"); 可逆算法
常規(guī)加密解密算法: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是可逆的,一個(gè)字符串可以經(jīng)rsa加密后,經(jīng)加密后的字符串傳到對(duì)端如服務(wù)器上,再進(jìn)行解密即可。前提是服務(wù)器知道解密的私鑰,當(dāng)然這個(gè)私鑰最好不要再網(wǎng)絡(luò)傳輸。RSA算法描述中需要以下幾個(gè)變量:
1、p和q 是不相等的,足夠大的兩個(gè)質(zhì)數(shù)。 p和q是保密的
2、n = p*q n是公開的
3、f(n) = (p-1)*(q-1)
4、e 是和f(n)互質(zhì)的質(zhì)數(shù)
5、計(jì)算參數(shù)d?
6、經(jīng)過上面5步計(jì)算得到公鑰KU=(e,n) 私鑰KR=(d,n)
下面兩篇文章對(duì)此有清晰的描述:
http://wenku.baidu.com/view/e53fbe36a32d7375a417801b.html
http://bank.hexun.com/2009-06-24/118958531.html
下面是java實(shí)現(xiàn)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;?? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? public?class?RSAUtil?{?? ?? ?????? ????private?KeyPair?keyPair?=?null;?? ?????? ????? ? ?? ????public?RSAUtil(){?? ????????try?{?? ????????????this.keyPair?=?this.generateKeyPair();?? ????????}?catch?(Exception?e)?{?? ????????????e.printStackTrace();?? ????????}?? ????}?? ?????? ????? ? ? ? ?? ????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());?? ????????}?? ?????? ????}?? ?? ????? ? ? ? ? ? ?? ????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());?? ????????}?? ?????? ????}?? ?? ????? ? ? ? ? ? ?? ????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());?? ????????}?? ????}?? ?? ????? ? ? ? ? ? ?? ????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);?? ?????????????? ?????????????? ????????????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);?? ?????????????????? ?????????????????? ????????????????i++;?? ????????????}?? ????????????return?raw;?? ????????}?catch?(Exception?e)?{?? ????????throw?new?Exception(e.getMessage());?? ????????}?? ????}?? ?? ????? ? ? ? ? ? ?? ????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());?? ????????}?? ????}?? ?????? ????? ? ? ? ?? ????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;?? ????}?? ?????? ????? ? ? ? ?? ????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>?? 測(cè)試代碼:
/****************************RSA加密解密測(cè)試********************************/
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();
}
下面是執(zhí)行結(jié)果:
加密后==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
上面代碼需要用到一個(gè)包rsa.jar,下載鏈接及上面的測(cè)試代碼我已打包,下載鏈接見下:
http://download.csdn.net/detail/yanzi1225627/7382263
轉(zhuǎn)載于:https://www.cnblogs.com/melons/p/5791931.html
總結(jié)
以上是生活随笔為你收集整理的Android网络传输中必用的两个加密算法:MD5 和 RSA 及Base64加密总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。