基于密码加密.doc_第1页
基于密码加密.doc_第2页
基于密码加密.doc_第3页
基于密码加密.doc_第4页
基于密码加密.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于密码加密 /wiki/security/1715-password-based-encryption原创作者: snowolf 阅读:689次 评论:0条 更新时间:2009-05-27 除了DES,我们还知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法PBE PBE PBEPassword-based encryption(基于密码加密)。其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性。是一种简便的加密方式。 通过java代码实现如下:Coder类见 单向加密 Java代码 1. importjava.security.Key; 2. importjava.util.Random; 3. 4. importjavax.crypto.Cipher; 5. importjavax.crypto.SecretKey; 6. importjavax.crypto.SecretKeyFactory; 7. importjavax.crypto.spec.PBEKeySpec; 8. importjavax.crypto.spec.PBEParameterSpec; 9. 10. /* 11. *PBE安全编码组件 12. * 13. *author梁栋 14. *version1.0 15. *since1.0 16. */17. publicabstractclassPBECoderextendsCoder 18. /* 19. *支持以下任意一种算法 20. * 21. * 22. *PBEWithMD5AndDES 23. *PBEWithMD5AndTripleDES 24. *PBEWithSHA1AndDESede 25. *PBEWithSHA1AndRC2_40 26. * 27. */28. publicstaticfinalStringALGORITHM=PBEWITHMD5andDES; 29. 30. /* 31. *盐初始化 32. * 33. *return 34. *throwsException 35. */36. publicstaticbyteinitSalt()throwsException 37. bytesalt=newbyte8; 38. Randomrandom=newRandom(); 39. random.nextBytes(salt); 40. returnsalt; 41. 42. 43. /* 44. *转换密钥 45. * 46. *parampassword 47. *return 48. *throwsException 49. */50. privatestaticKeytoKey(Stringpassword)throwsException 51. PBEKeySpeckeySpec=newPBEKeySpec(password.toCharArray(); 52. SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance(ALGORITHM); 53. SecretKeysecretKey=keyFactory.generateSecret(keySpec); 54. 55. returnsecretKey; 56. 57. 58. /* 59. *加密 60. * 61. *paramdata 62. *数据 63. *parampassword 64. *密码 65. *paramsalt 66. *盐 67. *return 68. *throwsException 69. */70. publicstaticbyteencrypt(bytedata,Stringpassword,bytesalt) 71. throwsException 72. 73. Keykey=toKey(password); 74. 75. PBEParameterSpecparamSpec=newPBEParameterSpec(salt,100); 76. Ciphercipher=Cipher.getInstance(ALGORITHM); 77. cipher.init(Cipher.ENCRYPT_MODE,key,paramSpec); 78. 79. returncipher.doFinal(data); 80. 81. 82. 83. /* 84. *解密 85. * 86. *paramdata 87. *数据 88. *parampassword 89. *密码 90. *paramsalt 91. *盐 92. *return 93. *throwsException 94. */95. publicstaticbytedecrypt(bytedata,Stringpassword,bytesalt) 96. throwsException 97. 98. Keykey=toKey(password); 99. 100. PBEParameterSpecparamSpec=newPBEParameterSpec(salt,100); 101. Ciphercipher=Cipher.getInstance(ALGORITHM); 102. cipher.init(Cipher.DECRYPT_MODE,key,paramSpec); 103. 104. returncipher.doFinal(data); 105. 106. 107. import java.security.Key;import java.util.Random;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.PBEKeySpec;import javax.crypto.spec.PBEParameterSpec;/* * PBE安全编码组件 * * author 梁栋 * version 1.0 * since 1.0 */public abstract class PBECoder extends Coder /* * 支持以下任意一种算法 * * * PBEWithMD5AndDES * PBEWithMD5AndTripleDES * PBEWithSHA1AndDESede * PBEWithSHA1AndRC2_40 * */public static final String ALGORITHM = PBEWITHMD5andDES;/* * 盐初始化 * * return * throws Exception */public static byte initSalt() throws Exception byte salt = new byte8;Random random = new Random();random.nextBytes(salt);return salt;/* * 转换密钥 * * param password * return * throws Exception */private static Key toKey(String password) throws Exception PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray();SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);SecretKey secretKey = keyFactory.generateSecret(keySpec);return secretKey;/* * 加密 * * param data * 数据 * param password * 密码 * param salt * 盐 * return * throws Exception */public static byte encrypt(byte data, String password, byte salt)throws Exception Key key = toKey(password);PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);return cipher.doFinal(data);/* * 解密 * * param data * 数据 * param password * 密码 * param salt * 盐 * return * throws Exception */public static byte decrypt(byte data, String password, byte salt)throws Exception Key key = toKey(password);PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);return cipher.doFinal(data);再给出一个测试类: Java代码 1. importstaticorg.junit.Assert.*; 2. 3. importorg.junit.Test; 4. 5. /* 6. * 7. *author梁栋 8. *version1.0 9. *since1.0 10. */11. publicclassPBECoderTest 12. 13. Test14. publicvoidtest()throwsException 15. StringinputStr=abc; 16. System.err.println(原文:+inputStr); 17. byteinput=inputStr.getBytes(); 18. 19. Stringpwd=efg; 20. System.err.println(密码:+pwd); 21. 22. bytesalt=PBECoder.initSalt(); 23. 24. bytedata=PBECoder.encrypt(input,pwd,salt); 25. 26. System.err.println(加密后:+PBECoder.encryptBASE64(data); 27. 28. byteoutput=PBECoder.decrypt(data,pwd,salt); 29. StringoutputStr=newString(output); 30. 31. System.err.println(解密后:+outputStr); 32. assertEquals(inputStr,outputStr); 33. 34. 35. import static org.junit.Assert.*;import org.junit.Test;/* * * author 梁栋 * version 1.0 * since 1.0 */public class PBECoderTest Testpublic void test() throws Exception String inputStr = abc;System.err.println(原文: + inputStr);byte input = inputStr.getBytes();String pwd = efg;System.err.println(密码: + pwd);byte salt = PBECoder.initSalt();byte data = PBECoder.encrypt(input, pwd, salt);Sys

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论