Java加密技术

上传人:沈*** 文档编号:111925301 上传时间:2022-06-21 格式:DOC 页数:79 大小:768KB
收藏 版权申诉 举报 下载
Java加密技术_第1页
第1页 / 共79页
Java加密技术_第2页
第2页 / 共79页
Java加密技术_第3页
第3页 / 共79页
资源描述:

《Java加密技术》由会员分享,可在线阅读,更多相关《Java加密技术(79页珍藏版)》请在装配图网上搜索。

1、.Java加密技术一文章分类:Java编程 加密解密,曾经是我一个毕业设计的重要组件。在工作了多年以后回想当时那个加密、解密算法,实在是太单纯了。 言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书。 如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5 SHA HMAC 复杂的对称加密DES、PBE、非对称加密算法: DES PBE RSA DH DSA ECC 本篇内容简要介绍BASE64、MD5、SHA、HMAC几种方法。MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法。我们通常只把他们作为加密的基

2、础。单纯的以上三种的加密并不可靠。BASE64按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。通过java代码实现如下:Java代码1.

3、 /*2. *BASE64解密3. *4. *paramkey5. *return6. *throwsException7. */8. publicstaticbytedecryptBASE64throwsException9. returnnewBASE64Decoder.decodeBuffer;10. 11. /*12. *BASE64加密13. *14. *paramkey15. *return16. *throwsException17. */18. publicstaticStringencryptBASE64throwsException19. returnnewBASE64En

4、coder.encodeBuffer;20. 主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。MD5MD5 - message-digest algorithm 5 信息-摘要算法缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。通过jav

5、a代码实现如下:Java代码1. /*2. *MD5加密3. *4. *paramdata5. *return6. *throwsException7. */8. publicstaticbyteencryptMD5throwsException9. MessageDigestmd5=MessageDigest.getInstance;10. md5.update;11. returnmd5.digest;12. 通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。SHASHASecure Hash Algorithm,安全散列算法,数字签

6、名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了,但是SHA仍然是公认的安全加密算法,较之MD5更为安全。通过java代码实现如下:Java代码1. /*2. *SHA加密3. *4. *paramdata5. *return6. *throwsException7. */8. publicstaticbyteencryptSHAthrowsException9. MessageDigestsha=MessageDigest.getInstance;10. sha.update;11. returnsha.digest;12. 13.

7、HMACHMACHash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。通过java代码实现如下:Java代码1. /*2. *初始化HMAC密钥3. *4. *return5. *throwsException6. */7. publicstaticStringinitMacKeythrowsExcepti

8、on8. KeyGeneratorkeyGenerator=KeyGenerator.getInstance;9. SecretKeysecretKey=keyGenerator.generateKey;10. returnencryptBASE64secretKey.getEncoded;11. 12. /*13. *HMAC加密14. *15. *paramdata16. *paramkey17. *return18. *throwsException19. */20. publicstaticbyteencryptHMACthrowsException21. SecretKeysecre

9、tKey=newSecretKeySpecdecryptBASE64,KEY_MAC;22. Macmac=Mac.getInstancesecretKey.getAlgorithm;23. mac.init;24. returnmac.doFinal;25. 给出一个完整类,如下:Java代码1. importjava.security.MessageDigest;2. importjavax.crypto.KeyGenerator;3. importjavax.crypto.Mac;4. importjavax.crypto.SecretKey;5. importsun.misc.BASE

10、64Decoder;6. importsun.misc.BASE64Encoder;7. /*8. *基础加密组件9. *10. *author梁栋11. *version1.012. *since1.013. */14. publicabstractclassCoder15. publicstaticfinalStringKEY_SHA=SHA;16. publicstaticfinalStringKEY_MD5=MD5;17. /*18. *MAC算法可选以下多种算法19. *20. *21. *HmacMD522. *HmacSHA123. *HmacSHA25624. *HmacSHA

11、38425. *HmacSHA51226. *27. */28. publicstaticfinalStringKEY_MAC=HmacMD5;29. /*30. *BASE64解密31. *32. *paramkey33. *return34. *throwsException35. */36. publicstaticbytedecryptBASE64throwsException37. returnnewBASE64Decoder.decodeBuffer;38. 39. /*40. *BASE64加密41. *42. *paramkey43. *return44. *throwsExc

12、eption45. */46. publicstaticStringencryptBASE64throwsException47. returnnewBASE64Encoder.encodeBuffer;48. 49. /*50. *MD5加密51. *52. *paramdata53. *return54. *throwsException55. */56. publicstaticbyteencryptMD5throwsException57. MessageDigestmd5=MessageDigest.getInstance;58. md5.update;59. returnmd5.d

13、igest;60. 61. /*62. *SHA加密63. *64. *paramdata65. *return66. *throwsException67. */68. publicstaticbyteencryptSHAthrowsException69. MessageDigestsha=MessageDigest.getInstance;70. sha.update;71. returnsha.digest;72. 73. /*74. *初始化HMAC密钥75. *76. *return77. *throwsException78. */79. publicstaticStringin

14、itMacKeythrowsException80. KeyGeneratorkeyGenerator=KeyGenerator.getInstance;81. SecretKeysecretKey=keyGenerator.generateKey;82. returnencryptBASE64secretKey.getEncoded;83. 84. /*85. *HMAC加密86. *87. *paramdata88. *paramkey89. *return90. *throwsException91. */92. publicstaticbyteencryptHMACthrowsExce

15、ption93. SecretKeysecretKey=newSecretKeySpecdecryptBASE64,KEY_MAC;94. Macmac=Mac.getInstancesecretKey.getAlgorithm;95. mac.init;96. returnmac.doFinal;97. 98. 再给出一个测试类:Java代码1. importstaticorg.junit.Assert.*;2. importorg.junit.Test;3. /*4. *5. *author梁栋6. *version1.07. *since1.08. */9. publicclassCod

16、erTest10. Test11. publicvoidtestthrowsException12. StringinputStr=简单加密;13. System.err.println;14. byteinputData=inputStr.getBytes;15. Stringcode=Coder.encryptBASE64;16. System.err.println;17. byteoutput=Coder.decryptBASE64;18. StringoutputStr=newString;19. System.err.println;20. /验证BASE64加密解密一致性21.

17、assertEquals;22. /验证MD5对于同一内容加密是否一致23. assertArrayEqualsCoder.encryptMD5,Coder24. .encryptMD5;25. /验证SHA对于同一内容加密是否一致26. assertArrayEqualsCoder.encryptSHA,Coder27. .encryptSHA;28. Stringkey=Coder.initMacKey;29. System.err.println;30. /验证HMAC对于同一内容,同一密钥加密是否一致31. assertArrayEqualsCoder.encryptHMAC,Code

18、r.encryptHMAC;33. BigIntegermd5=newBigIntegerCoder.encryptMD5;34. System.err.printlnMD5:n+md5.toString;35. BigIntegersha=newBigIntegerCoder.encryptSHA;36. System.err.printlnSHA:n+sha.toString;37. BigIntegermac=newBigIntegerCoder.encryptHMAC;38. System.err.printlnHMAC:n+mac.toString;39. 40. 控制台输出:Con

19、sole代码1. 原文:2. 简单加密3. BASE64加密后:4. 566A5Y2V5Yqg5a+G5. BASE64解密后:6. 简单加密7. Mac密钥:8. uGxdHC+6ylRDaik+leFtGwiMbuYUJ6mqHWyhSgF4trVkVBBSQvY/a22xU8XT1RUemdCWW155Bke9. pBIpkd7QHg=10. MD5:11. -550b4d90349ad4629462113e7934de5612. SHA:13. 91k9vo7p400cjkgfhjh0ia9qthsjagfn14. HMAC:15. 2287d192387e95694bdbba2fa9

20、41009a注意编译时,可能会看到如下提示:引用警告:sun.misc.BASE64Decoder 是 Sun 的专用 API,可能会在未来版本中删除import sun.misc.BASE64Decoder; 警告:sun.misc.BASE64Encoder 是 Sun 的专用 API,可能会在未来版本中删除import sun.misc.BASE64Encoder; BASE64Encoder和BASE64Decoder是非官方JDK实现类。虽然可以在JDK里能找到并使用,但是在API里查不到。JRE 中 sun 和 com.sun 开头包的类都是未被文档化的,他们属于 java, ja

21、vax 类库的基础,其中的实现大多数与底层平台有关,一般来说是不推荐使用的。 BASE64的加密解密是双向的,可以求反解。 MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。其中HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。 单向加密的用途主要是为了校验数据在传输过程中是否被修改。Java加密技术二文章分类:Java编程 接下来我们介绍对称加密算法,最常用的莫过于DES数据加密算法。DESDES-Data Encryption Standard,即数据加密算法。是IBM公司于1975年研究成功

22、并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。通过java代码实现如下:Coder类见Java加密技术一Java代码1. importjava.security.Key;2. importjava.security.SecureRandom;3. importjavax.crypto.Cipher;4. importjavax.crypt

23、o.KeyGenerator;5. importjavax.crypto.SecretKey;6. importjavax.crypto.SecretKeyFactory;7. importjavax.crypto.spec.DESKeySpec;8. /*9. *DES安全编码组件10. *11. *12. *支持DES、DESede、AES、Blowfish、RC2、RC413. *DESkeysizemustbeequalto5614. *DESedekeysizemustbeequalto112or16815. *AESkeysizemustbeequalto128,192or256,

24、but192and256bitsmaynotbeavailable16. *Blowfishkeysizemustbemultipleof8,andcanonlyrangefrom32to44817. *RC2keysizemustbebetween40and1024bits18. *RC4keysizemustbebetween40and1024bits19. *具体内容需要关注JDKDocumenthttp:/./docs/technotes/guides/security/SunProviders.html20. *21. *22. *author梁栋23. *version1.024.

25、 *since1.025. */26. publicabstractclassDESCoderextendsCoder27. /*28. *ALGORITHM算法29. *可替换为以下任意一种算法,同时key值的size相应改变。30. *31. *32. *DESkeysizemustbeequalto5633. *DESedekeysizemustbeequalto112or16834. *AESkeysizemustbeequalto128,192or256,but192and256bitsmaynotbeavailable35. *Blowfishkeysizemustbemultip

26、leof8,andcanonlyrangefrom32to44836. *RC2keysizemustbebetween40and1024bits37. *RC4keysizemustbebetween40and1024bits38. *39. *40. *在KeytoKey方法中使用下述代码41. *SecretKeysecretKey=newSecretKeySpec;替换42. *43. *DESKeySpecdks=newDESKeySpec;44. *SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance;45. *Secret

27、KeysecretKey=keyFactory.generateSecret;46. *47. */48. publicstaticfinalStringALGORITHM=DES;49. /*50. *转换密钥51. *52. *paramkey53. *return54. *throwsException55. */56. privatestaticKeytoKeythrowsException57. DESKeySpecdks=newDESKeySpec;58. SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance;59. Sec

28、retKeysecretKey=keyFactory.generateSecret;60. /当使用其他对称加密算法时,如AES、Blowfish等算法时,用下述代码替换上述三行代码61. /SecretKeysecretKey=newSecretKeySpec;62. returnsecretKey;63. 64. /*65. *解密66. *67. *paramdata68. *paramkey69. *return70. *throwsException71. */72. publicstaticbytedecryptthrowsException73. Keyk=toKeydecryp

29、tBASE64;74. Ciphercipher=Cipher.getInstance;75. cipher.init;76. returncipher.doFinal;77. 78. /*79. *加密80. *81. *paramdata82. *paramkey83. *return84. *throwsException85. */86. publicstaticbyteencryptthrowsException87. Keyk=toKeydecryptBASE64;88. Ciphercipher=Cipher.getInstance;89. cipher.init;90. ret

30、urncipher.doFinal;91. 92. /*93. *生成密钥94. *95. *return96. *throwsException97. */98. publicstaticStringinitKeythrowsException99. returninitKey;100. 101. /*102. *生成密钥103. *104. *paramseed105. *return106. *throwsException107. */108. publicstaticStringinitKeythrowsException109. SecureRandomsecureRandom=n

31、ull;110. if111. secureRandom=newSecureRandomdecryptBASE64;112. else113. secureRandom=newSecureRandom;114. 115. KeyGeneratorkg=KeyGenerator.getInstance;116. kg.init;117. SecretKeysecretKey=kg.generateKey;118. returnencryptBASE64secretKey.getEncoded;119. 120. 延续上一个类的实现,我们通过MD5以及SHA对字符串加密生成密钥,这是比较常见的密钥

32、生成方式。再给出一个测试类:Java代码1. importstaticorg.junit.Assert.*;2. importorg.junit.Test;3. /*4. *5. *author梁栋6. *version1.07. *since1.08. */9. publicclassDESCoderTest10. Test11. publicvoidtestthrowsException12. StringinputStr=DES;13. Stringkey=DESCoder.initKey;14. System.err.println;15. System.err.println;16.

33、 byteinputData=inputStr.getBytes;17. inputData=DESCoder.encrypt;18. System.err.println加密后:t+DESCoder.encryptBASE64;19. byteoutputData=DESCoder.decrypt;20. StringoutputStr=newString;21. System.err.println;22. assertEquals;23. 24. 得到的输出内容如下:Console代码1. 原文:DES2. 密钥:f3wEtRrV6q0=3. 加密后:C6qe9oNIzRY=4. 解密后

34、:DES 由控制台得到的输出,我们能够比对加密、解密后结果一致。这是一种简单的加密解密方式,只有一个密钥。 其实DES有很多同胞兄弟,如DESede、AES、Blowfish、RC2、RC4。这里就不过多阐述了,XX小异,只要换掉ALGORITHM换成对应的值,同时做一个代码替换SecretKey secretKey = new SecretKeySpec;就可以了,此外就是密钥长度不同了。Java代码1. /*2. *DESkeysizemustbeequalto563. *DESedekeysizemustbeequalto112or1684. *AESkeysizemustbeequal

35、to128,192or256,but192and256bitsmaynotbeavailable5. *Blowfishkeysizemustbemultipleof8,andcanonlyrangefrom32to4486. *RC2keysizemustbebetween40and1024bits7. *RC4keysizemustbebetween40and1024bits8. */Java加密技术三文章分类:Java编程 除了DES,我们还知道有DESede、AES、Blowfish、RC2、RC4等多种对称加密方式,其实现方式XX小异,这里介绍对称加密的另一个算法PBEPBE PBE

36、Password-based encryption基于密码加密。其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数这里我们叫做盐杂凑多重加密等方法保证数据的安全性。是一种简便的加密方式。通过java代码实现如下:Coder类见Java加密技术一Java代码1. importjava.security.Key;2. importjava.util.Random;3. importjavax.crypto.Cipher;4. importjavax.crypto.SecretKey;5. importjavax.crypto.SecretKeyFactory;6. importjavax

37、.crypto.spec.PBEKeySpec;7. importjavax.crypto.spec.PBEParameterSpec;8. /*9. *PBE安全编码组件10. *11. *author梁栋12. *version1.013. *since1.014. */15. publicabstractclassPBECoderextendsCoder16. /*17. *支持以下任意一种算法18. *19. *20. *PBEWithMD5AndDES21. *PBEWithMD5AndTripleDES22. *PBEWithSHA1AndDESede23. *PBEWithSHA

38、1AndRC2_4024. *25. */26. publicstaticfinalStringALGORITHM=PBEWITHMD5andDES;27. /*28. *盐初始化29. *30. *return31. *throwsException32. */33. publicstaticbyteinitSaltthrowsException34. bytesalt=newbyte8;35. Randomrandom=newRandom;36. random.nextBytes;37. returnsalt;38. 39. /*40. *转换密钥41. *42. *parampasswo

39、rd43. *return44. *throwsException45. */46. privatestaticKeytoKeythrowsException47. PBEKeySpeckeySpec=newPBEKeySpecpassword.toCharArray;48. SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance;49. SecretKeysecretKey=keyFactory.generateSecret;50. returnsecretKey;51. 52. /*53. *加密54. *55. *paramdata

40、56. *数据57. *parampassword58. *密码59. *paramsalt60. *盐61. *return62. *throwsException63. */64. publicstaticbyteencrypt65. throwsException66. Keykey=toKey;67. PBEParameterSpecparamSpec=newPBEParameterSpec;68. Ciphercipher=Cipher.getInstance;69. cipher.init;70. returncipher.doFinal;71. 72. /*73. *解密74.

41、*75. *paramdata76. *数据77. *parampassword78. *密码79. *paramsalt80. *盐81. *return82. *throwsException83. */84. publicstaticbytedecrypt85. throwsException86. Keykey=toKey;87. PBEParameterSpecparamSpec=newPBEParameterSpec;88. Ciphercipher=Cipher.getInstance;89. cipher.init;90. returncipher.doFinal;91. 92

42、. 再给出一个测试类:Java代码1. importstaticorg.junit.Assert.*;2. importorg.junit.Test;3. /*4. *5. *author梁栋6. *version1.07. *since1.08. */9. publicclassPBECoderTest10. Test11. publicvoidtestthrowsException12. StringinputStr=abc;13. System.err.println;14. byteinput=inputStr.getBytes;15. Stringpwd=efg;16. System

43、.err.println;17. bytesalt=PBECoder.initSalt;18. bytedata=PBECoder.encrypt;19. System.err.println加密后:+PBECoder.encryptBASE64;20. byteoutput=PBECoder.decrypt;21. StringoutputStr=newString;22. System.err.println;23. assertEquals;24. 25. 控制台输出:Console代码1. 原文:abc2. 密码:efg3. 加密后:iCZ0uRtaAhE=4. 解密后:abc 后续我们会介绍非对称加密算法,如RSA、DSA、DH、ECC等。Java加密技术四文章分类:Java编程 接下来我们介绍典型的非对称加密算法RSARSA 这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adlem

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!