1. package com.xgh.message.digest.test;
  2. import java.math.BigInteger;
  3. import java.security.MessageDigest;
  4. import java.security.SecureRandom;
  5. import javax.crypto.Cipher;
  6. import javax.crypto.KeyGenerator;
  7. import javax.crypto.Mac;
  8. import javax.crypto.SecretKey;
  9. import javax.crypto.spec.SecretKeySpec;
  10. import junit.framework.TestCase;
  11. import sun.misc.BASE64Decoder;
  12. import sun.misc.BASE64Encoder;
  13. /***
  14. * 单向加密方法
  15. *
  16. * MessageDigest 类提供【信息摘要算法】的功能,
  17. * 如HMAC、MD2、MD4、MD5、SHA-1、SHA-256、RIPEMD128、RIPEMD160。
  18. * 信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
  19. * @author xgh
  20. *
  21. *==================================================
  22. *速度排名:MD4 > MD5 > RIPEMD-128 > SHA-1 > REPEMD-160
  23. *按照《应用密码学手册》提供的表格数据为:
  24. *MD4 长度 128 相对速度 1
  25. *MD5 长度 128 相对速度 0.68
  26. *REPEMD-128 长度 128 相对速度 0.39
  27. *SHA-1 长度 160 相对速度 0.29
  28. *REPEMD-160 长度 160 相对速度 0.24
  29. *==================================================
  30. *结论:
  31. *又要安全又要速度,选择MD5
  32. *追求安全,不在意速度,相信传说,不相信阴谋论,选择SHA系列
  33. *追求速度,安全次之,可以选择MD4。
  34. *==================================================
  35. */
  36. public class MessageDigestUtil  extends TestCase{
  37. /***
  38. * MD5摘要生成
  39. * MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写
  40. * md5摘要算法算返回的数据长度为128个位,即16个字节。
  41. * @throws Exception
  42. */
  43. public void testEncryptMD5() throws Exception {
  44. String message ="Hell,在我心中,也许";
  45. MessageDigest md5 = MessageDigest.getInstance("MD5");
  46. md5.update(message.getBytes());
  47. //md5摘要算法算返回的数据长度为128个位,即16个字节。
  48. byte[] digestbytes = md5.digest();
  49. System.out.println("md5摘要原数据:"+message);
  50. System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
  51. System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
  52. System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
  53. System.out.println("--------------md5 end-----------------------");
  54. }
  55. /***
  56. * SHA摘要生成
  57. * SHA(Secure Hash Algorithm,安全散列算法),
  58. * sha摘要算法算返回的数据长度为160个位,即20个字节。
  59. * @throws Exception
  60. */
  61. public void testEncryptSHA() throws Exception {
  62. String message ="Hell,在我心中,也许";
  63. MessageDigest md5 = MessageDigest.getInstance("SHA");
  64. md5.update(message.getBytes());
  65. //md5摘要算法算返回的数据长度为128个位,即16个字节。
  66. byte[] digestbytes = md5.digest();
  67. System.out.println("sha摘要原数据:"+message);
  68. System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
  69. System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
  70. System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
  71. System.out.println("--------------sha end-----------------------");
  72. }
  73. /***
  74. * SHA1摘要生成
  75. * SHA(Secure Hash Algorithm,安全散列算法),
  76. * sha1摘要算法算返回的数据长度为160个位,即20个字节。
  77. * @throws Exception
  78. */
  79. public void testEncryptSHA1() throws Exception {
  80. String message ="Hell,在我心中,也许";
  81. MessageDigest md5 = MessageDigest.getInstance("SHA-1");
  82. md5.update(message.getBytes());
  83. //md5摘要算法算返回的数据长度为128个位,即16个字节。
  84. byte[] digestbytes = md5.digest();
  85. System.out.println("sha1摘要原数据:"+message);
  86. System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
  87. System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
  88. System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
  89. System.out.println("--------------sha1 end-----------------------");
  90. }
  91. /***
  92. * SHA256摘要生成
  93. * SHA(Secure Hash Algorithm,安全散列算法),
  94. * sha256摘要算法算返回的数据长度为160个位,即20个字节。
  95. * @throws Exception
  96. */
  97. public void testEncryptSHA256() throws Exception {
  98. String message ="Hell,在我心中,也许";
  99. MessageDigest md5 = MessageDigest.getInstance("SHA-256");
  100. md5.update(message.getBytes());
  101. //md5摘要算法算返回的数据长度为128个位,即16个字节。
  102. byte[] digestbytes = md5.digest();
  103. System.out.println("sha265摘要原数据:"+message);
  104. System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
  105. System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
  106. System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
  107. System.out.println("--------------sha256 end-----------------------");
  108. }
  109. /***
  110. * SHA512摘要生成
  111. * SHA(Secure Hash Algorithm,安全散列算法),
  112. * sha512摘要算法算返回的数据长度为160个位,即20个字节。
  113. * @throws Exception
  114. */
  115. public void testEncryptSHA512() throws Exception {
  116. String message ="Hell,在我心中,也许";
  117. MessageDigest md5 = MessageDigest.getInstance("SHA-512");
  118. md5.update(message.getBytes());
  119. //md5摘要算法算返回的数据长度为128个位,即16个字节。
  120. byte[] digestbytes = md5.digest();
  121. System.out.println("sha512摘要原数据:"+message);
  122. System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
  123. System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
  124. System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
  125. System.out.println("--------------sha512 end-----------------------");
  126. }
  127. /***
  128. * Md5摘要后,将字节摘要字节组转16进制数组
  129. * @param input
  130. * @return
  131. */
  132. public String testMD5ToHex() throws Exception{
  133. String data = "sfs有桂林地村要地wecllo";
  134. // 获得MD5摘要算法的 MessageDigest 对象
  135. MessageDigest mdInst = MessageDigest.getInstance("MD5");
  136. // 使用指定的字节更新摘要
  137. mdInst.update(data.getBytes());
  138. // 获得摘要密文
  139. byte[] md = mdInst.digest();
  140. // 把密文转换成十六进制的字符串形式
  141. StringBuffer hexString = new StringBuffer();
  142. // 字节数组转换为 十六进制 数
  143. for (int i = 0; i < md.length; i++) {
  144. String shaHex = Integer.toHexString(md[i] & 0xFF);
  145. if (shaHex.length() < 2) {//不足2位16进制位,则补0,一个字节是2位16进制位
  146. hexString.append(0);
  147. }
  148. hexString.append(shaHex);
  149. }
  150. return hexString.toString();
  151. }
  152. /***
  153. * SHA-1摘要后,将字节摘要字节组转16进制数组
  154. * @param input
  155. * @return
  156. */
  157. public String testSHA1ToHex() throws Exception{
  158. String data = "sfs有桂林地村要地wecllo";
  159. // 获得MD5摘要算法的 MessageDigest 对象
  160. MessageDigest mdInst = MessageDigest.getInstance("SHA-1");
  161. // 使用指定的字节更新摘要
  162. mdInst.update(data.getBytes());
  163. // 获得摘要密文
  164. byte[] md = mdInst.digest();
  165. // 把密文转换成十六进制的字符串形式
  166. StringBuffer hexString = new StringBuffer();
  167. // 字节数组转换为 十六进制 数
  168. for (int i = 0; i < md.length; i++) {
  169. int r = md[i] & 0xf;
  170. if (r <= 0xf) {//不足2位16进制位,则补0,一个字节是2位16进制位
  171. hexString.append(0);
  172. }
  173. hexString.append(Integer.toHexString(r));
  174. }
  175. return hexString.toString();
  176. }
  177. /***
  178. * HMAC摘要生成  单向加密算法
  179. * HMAC摘要算法算返回的数据长度为128个位,即16个字节。
  180. * HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。
  181. * 消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。
  182. * 使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。
  183. * @throws Exception
  184. * HMAC算法可选以下多种算法   :
  185. *   HmacMD5
  186. *   HmacSHA1
  187. *   HmacSHA256
  188. *   HmacSHA384
  189. *   HmacSHA512
  190. *
  191. */
  192. public void testEncryptHMAC() throws Exception {
  193. String message ="Hell,在我心中,也许";
  194. KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA1");
  195. SecretKey secretKey1 = keyGenerator.generateKey();
  196. //Mac密钥
  197. String key =  new BASE64Encoder().encode((secretKey1.getEncoded()));
  198. System.out.println("Mac密钥:"+key);
  199. SecretKey secretKey2 = new SecretKeySpec(new BASE64Decoder().decodeBuffer(key), "HmacSHA1");
  200. //返回此密钥编码格式的名称。
  201. //System.out.println(secretKey1.getFormat());
  202. Mac mac = Mac.getInstance(secretKey2.getAlgorithm());
  203. mac.init(secretKey2);
  204. byte[] digestbytes = mac.doFinal(message.getBytes());
  205. System.out.println("HMAC摘要原数据:"+message);
  206. System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
  207. System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
  208. System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
  209. System.out.println("--------------HMAC end-----------------------");
  210. }
  211. /***
  212. * AES 双向加密算法
  213. * @param content   待加密内容
  214. * @param password  加密密钥
  215. * @return
  216. */
  217. public  byte[] testEncryptAES() throws Exception{
  218. String content = "Hello,明天天气不错";
  219. String password = "123456";
  220. KeyGenerator kgen = KeyGenerator.getInstance("AES");
  221. kgen.init(128, new SecureRandom(password.getBytes()));
  222. SecretKey secretKey = kgen.generateKey();
  223. byte[] enCodeFormat = secretKey.getEncoded();
  224. SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
  225. Cipher cipher = Cipher.getInstance("AES");// 创建密码器
  226. byte[] byteContent = content.getBytes("utf-8");
  227. cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
  228. byte[] result = cipher.doFinal(byteContent);
  229. System.out.println("AES加密后的Base64结果:");
  230. System.out.println(new BASE64Encoder().encode(result));
  231. return result; // 加密
  232. }
  233. /***
  234. *  AES 双向加密算法
  235. * @param content  待解密内容
  236. * @param password 解密密钥
  237. * @return
  238. */
  239. public  byte[] testDecryptAES() throws Exception{
  240. String content = "2M8d6HQ0qtXqSSuL83ILs348ls6C8JlZnfu0UFgCkOw=";
  241. String password = "123456";
  242. byte[] contentbyte = new BASE64Decoder().decodeBuffer(content);
  243. KeyGenerator kgen = KeyGenerator.getInstance("AES");
  244. kgen.init(128, new SecureRandom(password.getBytes()));
  245. SecretKey secretKey = kgen.generateKey();
  246. byte[] enCodeFormat = secretKey.getEncoded();
  247. SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
  248. Cipher cipher = Cipher.getInstance("AES");// 创建密码器
  249. cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
  250. byte[] result = cipher.doFinal(contentbyte);
  251. System.out.println("解密结果:");
  252. System.out.println(new String(result,"UTF-8"));
  253. return result; // 加密
  254. }
  255. }
package com.xgh.message.digest.test;

import java.math.BigInteger;

import java.security.MessageDigest;

import java.security.SecureRandom; import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.Mac;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec; import junit.framework.TestCase;

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder; /***
  • 单向加密方法
  • MessageDigest 类提供【信息摘要算法】的功能,
  • 如HMAC、MD2、MD4、MD5、SHA-1、SHA-256、RIPEMD128、RIPEMD160。
  • 信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
  • @author xgh
*==================================================

*速度排名:MD4 > MD5 > RIPEMD-128 > SHA-1 > REPEMD-160

*按照《应用密码学手册》提供的表格数据为:

*MD4 长度 128 相对速度 1

*MD5 长度 128 相对速度 0.68

*REPEMD-128 长度 128 相对速度 0.39

*SHA-1 长度 160 相对速度 0.29

*REPEMD-160 长度 160 相对速度 0.24

*==================================================

*结论:

*又要安全又要速度,选择MD5

*追求安全,不在意速度,相信传说,不相信阴谋论,选择SHA系列

*追求速度,安全次之,可以选择MD4。

*==================================================

*/

public class MessageDigestUtil extends TestCase{
/***
* MD5摘要生成
* MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写
* md5摘要算法算返回的数据长度为128个位,即16个字节。
* @throws Exception
*/
public void testEncryptMD5() throws Exception {
String message ="Hell,在我心中,也许";
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(message.getBytes());
//md5摘要算法算返回的数据长度为128个位,即16个字节。
byte[] digestbytes = md5.digest();
System.out.println("md5摘要原数据:"+message);
System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
System.out.println("--------------md5 end-----------------------");
} /***
* SHA摘要生成
* SHA(Secure Hash Algorithm,安全散列算法),
* sha摘要算法算返回的数据长度为160个位,即20个字节。
* @throws Exception
*/
public void testEncryptSHA() throws Exception {
String message ="Hell,在我心中,也许";
MessageDigest md5 = MessageDigest.getInstance("SHA");
md5.update(message.getBytes());
//md5摘要算法算返回的数据长度为128个位,即16个字节。
byte[] digestbytes = md5.digest();
System.out.println("sha摘要原数据:"+message);
System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
System.out.println("--------------sha end-----------------------");
} /***
* SHA1摘要生成
* SHA(Secure Hash Algorithm,安全散列算法),
* sha1摘要算法算返回的数据长度为160个位,即20个字节。
* @throws Exception
*/
public void testEncryptSHA1() throws Exception {
String message ="Hell,在我心中,也许";
MessageDigest md5 = MessageDigest.getInstance("SHA-1");
md5.update(message.getBytes());
//md5摘要算法算返回的数据长度为128个位,即16个字节。
byte[] digestbytes = md5.digest();
System.out.println("sha1摘要原数据:"+message);
System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
System.out.println("--------------sha1 end-----------------------");
} /***
* SHA256摘要生成
* SHA(Secure Hash Algorithm,安全散列算法),
* sha256摘要算法算返回的数据长度为160个位,即20个字节。
* @throws Exception
*/
public void testEncryptSHA256() throws Exception {
String message ="Hell,在我心中,也许";
MessageDigest md5 = MessageDigest.getInstance("SHA-256");
md5.update(message.getBytes());
//md5摘要算法算返回的数据长度为128个位,即16个字节。
byte[] digestbytes = md5.digest();
System.out.println("sha265摘要原数据:"+message);
System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
System.out.println("--------------sha256 end-----------------------");
} /***
* SHA512摘要生成
* SHA(Secure Hash Algorithm,安全散列算法),
* sha512摘要算法算返回的数据长度为160个位,即20个字节。
* @throws Exception
*/
public void testEncryptSHA512() throws Exception {
String message ="Hell,在我心中,也许";
MessageDigest md5 = MessageDigest.getInstance("SHA-512");
md5.update(message.getBytes());
//md5摘要算法算返回的数据长度为128个位,即16个字节。
byte[] digestbytes = md5.digest();
System.out.println("sha512摘要原数据:"+message);
System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
System.out.println("--------------sha512 end-----------------------");
} /***
* Md5摘要后,将字节摘要字节组转16进制数组
* @param input
* @return
*/
public String testMD5ToHex() throws Exception{
String data = "sfs有桂林地村要地wecllo";
// 获得MD5摘要算法的 MessageDigest 对象
MessageDigest mdInst = MessageDigest.getInstance("MD5");
// 使用指定的字节更新摘要
mdInst.update(data.getBytes());
// 获得摘要密文
byte[] md = mdInst.digest();
// 把密文转换成十六进制的字符串形式
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i &lt; md.length; i++) {
String shaHex = Integer.toHexString(md[i] &amp; 0xFF);
if (shaHex.length() &lt; 2) {//不足2位16进制位,则补0,一个字节是2位16进制位
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString();
} /***
* SHA-1摘要后,将字节摘要字节组转16进制数组
* @param input
* @return
*/
public String testSHA1ToHex() throws Exception{
String data = "sfs有桂林地村要地wecllo";
// 获得MD5摘要算法的 MessageDigest 对象
MessageDigest mdInst = MessageDigest.getInstance("SHA-1");
// 使用指定的字节更新摘要
mdInst.update(data.getBytes());
// 获得摘要密文
byte[] md = mdInst.digest();
// 把密文转换成十六进制的字符串形式
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i &lt; md.length; i++) {
int r = md[i] &amp; 0xf;
if (r &lt;= 0xf) {//不足2位16进制位,则补0,一个字节是2位16进制位
hexString.append(0);
}
hexString.append(Integer.toHexString(r));
}
return hexString.toString();
} /***
* HMAC摘要生成 单向加密算法
* HMAC摘要算法算返回的数据长度为128个位,即16个字节。
* HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。
* 消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。
* 使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。
* @throws Exception
* HMAC算法可选以下多种算法 :
* HmacMD5
* HmacSHA1
* HmacSHA256
* HmacSHA384
* HmacSHA512
*
*/ public void testEncryptHMAC() throws Exception {
String message ="Hell,在我心中,也许";
KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA1");
SecretKey secretKey1 = keyGenerator.generateKey();
//Mac密钥
String key = new BASE64Encoder().encode((secretKey1.getEncoded()));
System.out.println("Mac密钥:"+key); SecretKey secretKey2 = new SecretKeySpec(new BASE64Decoder().decodeBuffer(key), "HmacSHA1");
//返回此密钥编码格式的名称。
//System.out.println(secretKey1.getFormat());
Mac mac = Mac.getInstance(secretKey2.getAlgorithm());
mac.init(secretKey2);
byte[] digestbytes = mac.doFinal(message.getBytes()); System.out.println("HMAC摘要原数据:"+message);
System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
System.out.println("--------------HMAC end-----------------------"); } /***
* AES 双向加密算法
* @param content 待加密内容
* @param password 加密密钥
* @return
*/
public byte[] testEncryptAES() throws Exception{
String content = "Hello,明天天气不错";
String password = "123456";
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(byteContent);
System.out.println("AES加密后的Base64结果:");
System.out.println(new BASE64Encoder().encode(result));
return result; // 加密
} /***
* AES 双向加密算法
* @param content 待解密内容
* @param password 解密密钥
* @return
*/
public byte[] testDecryptAES() throws Exception{
String content = "2M8d6HQ0qtXqSSuL83ILs348ls6C8JlZnfu0UFgCkOw=";
String password = "123456";
byte[] contentbyte = new BASE64Decoder().decodeBuffer(content);
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(contentbyte);
System.out.println("解密结果:");
System.out.println(new String(result,"UTF-8"));
return result; // 加密
}

}

信息摘要算法 MessageDigestUtil的更多相关文章

  1. MD5加密算法(信息摘要算法)、Base64算法

    1 什么是MD5 信息摘要算法,可以将字符进行加密,每个加密对象在进行加密后都是等长的 应用场景:将用户密码经过MD5加密后再存储到数据库中,这样即使是超级管理员也没有能力知道用户的具体密码是多少:因 ...

  2. MD5( 信息摘要算法)的概念原理及python代码的实现

    简述: message-digest algorithm 5(信息-摘要算法).经常说的“MD5加密”,就是它→信息-摘要算法. md5,其实就是一种算法.可以将一个字符串,或文件,或压缩包,执行md ...

  3. 信息摘要算法之一:MD5算法解析及实现

    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现. ...

  4. 信息摘要算法之五:HMAC算法分析与实现

    MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥.因此MAC算法也经常被称作HMAC算法. ...

  5. OpenSSL实现了5种信息摘要算法有哪些?

    OpenSSL实现了5种信息摘要算法,分别是MD2.MD5.MDC2.SHA(SHA1)和RIPEMD.SHA算法事实上包括了SHA和SHA1两种信息摘要算法.此外,OpenSSL还实现了DSS标准中 ...

  6. 详解 MD5 信息摘要算法

    对于软件研发人员来说 MD5 不是一个陌生的词汇,平时的软件研发中,经常使用 MD5 校验消息是否被篡改.验证文件完整性,甚至将MD5当作加密算法使用. MD5虽不陌生,但不是所有研发人员都了解其算法 ...

  7. 信息摘要算法之三:SHA256算法分析与实现

    前面一篇中我们分析了SHA的原理,并且以SHA1为例实现了相关的算法,在这一片中我们将进一步分析SHA2并实现之. 1.SHA简述 前面的篇章中我们已经说明过,SHA实际包括有一系列算法,分别是SHA ...

  8. 信息摘要算法之六:HKDF算法分析与实现

    HKDF是一种特定的键衍生函数(KDF),即初始键控材料的功能,KDF从其中派生出一个或多个密码强大的密钥.在此我们想要描述的是基于HMAC的HKDF. 1.HKDF概述 密钥派生函数(KDF)是密码 ...

  9. 信息摘要算法之四:SHA512算法分析与实现

    前面一篇中我们分析了SHA256的原理,并且实现了该算法,在这一篇中我们将进一步分析SHA512并实现之. 1.SHA简述 尽管在前面的篇章中我们介绍过SHA算法,但出于阐述的完整性我依然要简单的说明 ...

随机推荐

  1. linux php5.4安装phalcon

    PHP版本5.6以上,安装可参考.https://blog.csdn.net/happysdh/article/details/51450654 在phalcon3.0以后就不支持php5.4了. 要 ...

  2. oslo_messaging使用eventlet executor时rpc无法调用的问题

    python2.7.5 oslo.messaging==9.8.0 现象: 从debug日志可以看到rpcServer接收到了rabbitmq的消息, 但是没有调用endpoints中的相应方法 分析 ...

  3. flex 手册摘要

    个人学习 摘抄翻译 http://www.cs.princeton.edu/~appel/modern/c/software/flex/flex.html#SEC1 程序的格式 分成显示的三部分 由% ...

  4. hbase Hfile处理原因

    Hile 内部的数据是按key排序好的,但Hfile之间数据并不能保证key的排序,也就是说对于新生成的Hfile,其内部的key并不都比老的Hfile的大,因此每次检索时,都需要在所有的Hfile中 ...

  5. SVN 提交时文件锁定 svn: E155004: '' is already locked

    1.先安装TortoiseSVN TortoiseSVN安装成功后,找到工作路径下的项目右键 TortoiseSVN --> Clean up... --> Break locks 勾选上 ...

  6. BZOJ1491:1491: [NOI2007]社交网络

    1491: [NOI2007]社交网络 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2204  Solved: 1175[Submit][Status ...

  7. spring源码学习之AOP(一)

    继续源码学习,看了spring中基础的容器和AOP感觉自己也没有什么长进,哈哈,我也不知道到底有用没有,这可能是培养自己的一种精神吧,不管那么多,继续学习!AOP中 AOP中几个重要的概念:(1)Ad ...

  8. 洛谷P3299 保护出题人

    注意每一关的时候,前一关的植物会消失.保留整数指四舍五入. 解:冷静分析一波,列一个式子出来,发现每一关的植物攻击力要是(ai + ... + aj) / (xi + d * (i - j))的最大值 ...

  9. TZ_05_Spring_基于AOP的xml配置

    1.分析    1>首先我们有一个Service需要增强 将Service增加一个日志(Logger)          2>写了一个日志的通知并且它可以对Service进行日志增强   ...

  10. iphone越狱开发之Class-Dump

    刚刚开始接触ios越狱开发,现在开始纪录每天的点滴进展 装载请注明 http://www.cnblogs.com/xiongwj0910/archive/2012/08/16/2642988.html ...