Java常用加密算法实例总结
本文实例总结了Java常用加密算法。分享给大家供大家参考,具体如下:
项目中第一次深入地了解到加密算法的使用,现第一阶段结束,将使用到的加密算法和大家分享一下:
首先还是先给大家普及一下常用加密算法的基础知识
基本的单向加密算法
BASE64严格地说,属于编码格式,而非加密算法
MD5(MessageDigestalgorithm5,信息摘要算法)
SHA(SecureHashAlgorithm,安全散列算法)
复杂的加密算法
RSA(算法的名字以发明者的名字命名:RonRivest,AdiShamir和LeonardAdleman)
DES/3DES(DigitalSignatureAlgorithm,数字签名)
国密算法
SM2/SM4(是由国家密码管理局编制的一种商用密码分组标准对称算法)
使用方法:
base64
publicstaticbyte[]encode2Base64(byte[]bytes){ byte[]bts=Base64.encodeBase64(bytes); returnbts; } publicstaticbyte[]decode2Base64(Stringstr){ byte[]bts=Base64.decodeBase64(str); returnbts; }
MD5
publicstaticStringmd5(Stringstr){ try{ MessageDigestdigest=MessageDigest.getInstance("MD5"); returnnewString(digest.digest(str.getBytes())); }catch(NoSuchAlgorithmExceptione){ e.printStackTrace(); } return""; }
SHA-1
publicstaticbyte[]sha1ToBytes(Stringstr){ try{ MessageDigestdigest=MessageDigest.getInstance("SHA-1"); byte[]bts=digest.digest(str.getBytes()); returnbts; }catch(Exceptione){ e.printStackTrace(); } returnnull; }
DES/3DES
publicstaticbyte[]encryptMode(StringkeyStr,byte[]src){ try{ //生成密钥 SecretKeydeskey=newSecretKeySpec(keyStr.getBytes(),"DESede"); //加密 Cipherc1=Cipher.getInstance("DESede"); c1.init(Cipher.ENCRYPT_MODE,deskey); returnc1.doFinal(src); }catch(java.security.NoSuchAlgorithmExceptione1){ e1.printStackTrace(); }catch(javax.crypto.NoSuchPaddingExceptione2){ e2.printStackTrace(); }catch(java.lang.Exceptione3){ e3.printStackTrace(); } returnnull; } publicstaticbyte[]decryptMode(StringkeyStr,byte[]src){ try{ SecretKeydeskey=newSecretKeySpec(keyStr.getBytes(),"DESede"); //解密 Cipherc1=Cipher.getInstance("DESede"); c1.init(Cipher.DECRYPT_MODE,deskey); returnc1.doFinal(src); }catch(java.security.NoSuchAlgorithmExceptione1){ e1.printStackTrace(); }catch(javax.crypto.NoSuchPaddingExceptione2){ e2.printStackTrace(); }catch(java.lang.Exceptione3){ e3.printStackTrace(); } returnnull; }
RSA
/** *初始化公密钥 * *@return *@throwsException */ publicstaticMapinitKey()throwsException{ KeyPairGeneratorkpGenerator=KeyPairGenerator.getInstance("RSA"); kpGenerator.initialize(2048); KeyPairkeyPair=kpGenerator.generateKeyPair(); //存储公钥 PublicKeypublicKey=keyPair.getPublic(); //存储密钥 PrivateKeyprivateKey=keyPair.getPrivate(); Map keyMap=newHashMap (); keyMap.put(PUBLIC_KEY,publicKey); keyMap.put(PRIVATE_KEY,privateKey); returnkeyMap; } /** *取出公钥 * *@paramkeyMap *@return */ publicstaticStringgetPublicKey(Map keyMap){ Keykey=(Key)keyMap.get("RSAPublicKey"); returnencode2Base64(newString(key.getEncoded())); } /** *取出密钥 * *@paramkeyMap *@return */ publicstaticStringgetPrivateKey(Map keyMap){ Keykey=(Key)keyMap.get("RSAPrivateKey"); returnencode2Base64(newString(key.getEncoded())); } /** *公钥加密 * *@paramdata *@parampublicKey *@return *@throwsException */ publicstaticStringencryptByPublicKey(Stringdata,RSAPublicKeypublicKey) throwsException{ Ciphercipher=Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE,publicKey); //模长 intkey_len=publicKey.getModulus().bitLength()/8; //加密数据长度<=模长-11 String[]datas=splitString(data,key_len-11); Stringmi=""; //如果明文长度大于模长-11则要分组加密 for(Strings:datas){ mi+=bcd2Str(cipher.doFinal(s.getBytes())); } returnmi; } /** *私钥加密 * *@paramdata *@paramprivateKey *@return *@throwsException */ publicstaticStringencryptByPrivateKey(Stringdata, RSAPrivateKeyprivateKey)throwsException{ Ciphercipher=Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE,privateKey); //模长 intkey_len=privateKey.getModulus().bitLength()/8; //加密数据长度<=模长-11 String[]datas=splitString(data,key_len-11); Stringmi=""; //如果明文长度大于模长-11则要分组加密 for(Strings:datas){ mi+=bcd2Str(cipher.doFinal(s.getBytes())); } returnmi; } /** *私钥解密 * *@paramdata *@paramprivateKey *@return *@throwsException */ publicstaticStringdecryptByPrivateKey(Stringdata, RSAPrivateKeyprivateKey)throwsException{ Ciphercipher=Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE,privateKey); //模长 intkey_len=privateKey.getModulus().bitLength()/8; byte[]bytes=data.getBytes(); byte[]bcd=ASCII_To_BCD(bytes,bytes.length); System.err.println(bcd.length); //如果密文长度大于模长则要分组解密 Stringming=""; byte[][]arrays=splitArray(bcd,key_len); for(byte[]arr:arrays){ ming+=newString(cipher.doFinal(arr)); } returnming; } /** *ASCII码转BCD码 * */ publicstaticbyte[]ASCII_To_BCD(byte[]ascii,intasc_len){ byte[]bcd=newbyte[asc_len/2]; intj=0; for(inti=0;i<(asc_len+1)/2;i++){ bcd[i]=asc_to_bcd(ascii[j++]); bcd[i]=(byte)(((j>=asc_len)?0x00:asc_to_bcd(ascii[j++]))+(bcd[i]<<4)); } returnbcd; } publicstaticbyteasc_to_bcd(byteasc){ bytebcd; if((asc>='0')&&(asc<='9')) bcd=(byte)(asc-'0'); elseif((asc>='A')&&(asc<='F')) bcd=(byte)(asc-'A'+10); elseif((asc>='a')&&(asc<='f')) bcd=(byte)(asc-'a'+10); else bcd=(byte)(asc-48); returnbcd; } /** *BCD转字符串 */ publicstaticStringbcd2Str(byte[]bytes){ chartemp[]=newchar[bytes.length*2],val; for(inti=0;i >4)&0x0f); temp[i*2]=(char)(val>9?val+'A'-10:val+'0'); val=(char)(bytes[i]&0x0f); temp[i*2+1]=(char)(val>9?val+'A'-10:val+'0'); } returnnewString(temp); } /** *拆分字符串 */ publicstaticString[]splitString(Stringstring,intlen){ intx=string.length()/len; inty=string.length()%len; intz=0; if(y!=0){ z=1; } String[]strings=newString[x+z]; Stringstr=""; for(inti=0;i 以上就是本次项目中用到的加密算法,需要注意的是编码格式一定要双方统一,如果不一致则加解密不成功。
PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:
文字在线加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_encodeMD5在线加密工具:
http://tools.jb51.net/password/CreateMD5Password在线散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha在线sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode更多关于java相关内容感兴趣的读者可查看本站专题:《Java数学运算技巧总结》、《Java数据结构与算法教程》、《Java字符与字符串操作技巧总结》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。