• 输入为一组4字节的数据,输出为一组5字节的数据加密算法匹配美国通用加密算法


    加密算法匹配:
    * 输入为一组4字节的数据,输出为一组5字节的数据(其中第一个字节固定不变,其他4个字节可变),
    * 匹配所使用的加密算法,可随时提供数据样本。
    * 注:相关产品为美国公司生产,可考虑美国通用加密算法
    * 深入了解加密算法

     

    1. package controller.com.codermart.controller;
    2. import controller.com.codermart.controller.Util.MD5Utils;
    3. import java.io.UnsupportedEncodingException;
    4. import java.security.MessageDigest;
    5. import java.security.NoSuchAlgorithmException;
    6. import java.util.ArrayList;
    7. import java.util.Arrays;
    8. import java.util.Random;
    9. /**
    10. * Created by wanzhongLiao on 2023/10/3.
    11. */
    12. public class MainController {
    13. public static void main(String[] args){
    14. String hell = encodeStr("kell");
    15. System.out.println(hell);
    16. }
    17. /**
    18. * 加密算法匹配:
    19. * 输入为一组4字节的数据,输出为一组5字节的数据(其中第一个字节固定不变,其他4个字节可变),
    20. * 匹配所使用的加密算法,可随时提供数据样本。
    21. * 注:相关产品为美国公司生产,可考虑美国通用加密算法
    22. * 深入了解加密算法
    23. * @param srcStr
    24. * @return
    25. */
    26. public static String encodeStr(String srcStr){
    27. if(srcStr==null){
    28. return null;
    29. }
    30. if(srcStr.isEmpty()){
    31. return null;
    32. }
    33. int length = srcStr.length();
    34. if(length<1 || length>4){
    35. return null;
    36. }
    37. String md5 = MD5Utils.MD5(srcStr);
    38. char c = srcStr.charAt(0);
    39. StringBuilder stringBuilder = new StringBuilder();
    40. stringBuilder.append(c);
    41. Random random = new Random();
    42. for (int i = 0; i < md5.length(); i++) {
    43. int randomIndex=random.nextInt(md5.length());
    44. char c1 = md5.charAt(randomIndex);
    45. stringBuilder.append(c1);
    46. if (stringBuilder.toString().length()==5){
    47. break;
    48. }
    49. }
    50. return stringBuilder.toString();
    51. }
    52. public static final byte[] computeMD5(byte[] content) {
    53. try {
    54. MessageDigest md5 = MessageDigest.getInstance("MD5");
    55. return md5.digest(content);
    56. } catch (NoSuchAlgorithmException e) {
    57. throw new RuntimeException(e);
    58. }
    59. }
    60. }
    1. package controller.com.codermart.controller.Util;
    2. import java.math.BigInteger;
    3. import java.security.MessageDigest;
    4. import java.security.NoSuchAlgorithmException;
    5. /**
    6. * MD5加密/验证工具类
    7. *
    8. */
    9. public class MD5Utils {
    10. static final char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    11. static final char hexDigitsLower[] = { '0', '1', '2', '3', '4', '5', '6', '7','8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    12. /**
    13. * 对字符串 MD5 无盐值加密
    14. *
    15. * @param plainText
    16. * 传入要加密的字符串
    17. * @return
    18. * MD5加密后生成32位(小写字母+数字)字符串
    19. */
    20. public static String MD5Lower(String plainText) {
    21. try {
    22. // 获得MD5摘要算法的 MessageDigest 对象
    23. MessageDigest md = MessageDigest.getInstance("MD5");
    24. // 使用指定的字节更新摘要
    25. md.update(plainText.getBytes());
    26. // digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
    27. // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值。1 固定值
    28. return new BigInteger(1, md.digest()).toString(16);
    29. } catch (NoSuchAlgorithmException e) {
    30. e.printStackTrace();
    31. return null;
    32. }
    33. }
    34. /**
    35. * 对字符串 MD5 加密
    36. *
    37. * @param plainText
    38. * 传入要加密的字符串
    39. * @return
    40. * MD5加密后生成32位(大写字母+数字)字符串
    41. */
    42. public static String MD5Upper(String plainText) {
    43. try {
    44. // 获得MD5摘要算法的 MessageDigest 对象
    45. MessageDigest md = MessageDigest.getInstance("MD5");
    46. // 使用指定的字节更新摘要
    47. md.update(plainText.getBytes());
    48. // 获得密文
    49. byte[] mdResult = md.digest();
    50. // 把密文转换成十六进制的字符串形式
    51. int j = mdResult.length;
    52. char str[] = new char[j * 2];
    53. int k = 0;
    54. for (int i = 0; i < j; i++) {
    55. byte byte0 = mdResult[i];
    56. str[k++] = hexDigits[byte0 >>> 4 & 0xf];// 取字节中高 4 位的数字转换, >>> 为逻辑右移,将符号位一起右移
    57. str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
    58. }
    59. return new String(str);
    60. } catch (Exception e) {
    61. e.printStackTrace();
    62. return null;
    63. }
    64. }
    65. /**
    66. * 对字符串 MD5 加盐值加密
    67. *
    68. * @param plainText
    69. * 传入要加密的字符串
    70. * @param saltValue
    71. * 传入要加的盐值
    72. * @return
    73. * MD5加密后生成32位(小写字母+数字)字符串
    74. */
    75. public static String MD5Lower(String plainText, String saltValue) {
    76. try {
    77. // 获得MD5摘要算法的 MessageDigest 对象
    78. MessageDigest md = MessageDigest.getInstance("MD5");
    79. // 使用指定的字节更新摘要
    80. md.update(plainText.getBytes());
    81. md.update(saltValue.getBytes());
    82. // digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
    83. // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值。1 固定值
    84. return new BigInteger(1, md.digest()).toString(16);
    85. } catch (NoSuchAlgorithmException e) {
    86. e.printStackTrace();
    87. return null;
    88. }
    89. }
    90. /**
    91. * 对字符串 MD5 加盐值加密
    92. *
    93. * @param plainText
    94. * 传入要加密的字符串
    95. * @param saltValue
    96. * 传入要加的盐值
    97. * @return
    98. * MD5加密后生成32位(大写字母+数字)字符串
    99. */
    100. public static String MD5Upper(String plainText, String saltValue) {
    101. try {
    102. // 获得MD5摘要算法的 MessageDigest 对象
    103. MessageDigest md = MessageDigest.getInstance("MD5");
    104. // 使用指定的字节更新摘要
    105. md.update(plainText.getBytes());
    106. md.update(saltValue.getBytes());
    107. // 获得密文
    108. byte[] mdResult = md.digest();
    109. // 把密文转换成十六进制的字符串形式
    110. int j = mdResult.length;
    111. char str[] = new char[j * 2];
    112. int k = 0;
    113. for (int i = 0; i < j; i++) {
    114. byte byte0 = mdResult[i];
    115. str[k++] = hexDigits[byte0 >>> 4 & 0xf];
    116. str[k++] = hexDigits[byte0 & 0xf];
    117. }
    118. return new String(str);
    119. } catch (Exception e) {
    120. e.printStackTrace();
    121. return null;
    122. }
    123. }
    124. /**
    125. * MD5加密后生成32位(小写字母+数字)字符串
    126. * 同 MD5Lower() 一样
    127. */
    128. public final static String MD5(String plainText) {
    129. try {
    130. MessageDigest mdTemp = MessageDigest.getInstance("MD5");
    131. mdTemp.update(plainText.getBytes("UTF-8"));
    132. byte[] md = mdTemp.digest();
    133. int j = md.length;
    134. char str[] = new char[j * 2];
    135. int k = 0;
    136. for (int i = 0; i < j; i++) {
    137. byte byte0 = md[i];
    138. str[k++] = hexDigitsLower[byte0 >>> 4 & 0xf];
    139. str[k++] = hexDigitsLower[byte0 & 0xf];
    140. }
    141. return new String(str);
    142. } catch (Exception e) {
    143. return null;
    144. }
    145. }
    146. /**
    147. * 校验MD5码
    148. *
    149. * @param text
    150. * 要校验的字符串
    151. * @param md5
    152. * md5值
    153. * @return 校验结果
    154. */
    155. public static boolean valid(String text, String md5) {
    156. return md5.equals(MD5(text)) || md5.equals(MD5(text).toUpperCase());
    157. }
    158. /**
    159. * 测试
    160. * @param args
    161. */
    162. public static void main(String[] args) {
    163. String plainText = "admin";
    164. String saltValue = "admin123";
    165. System.out.println(MD5Lower(plainText));
    166. System.out.println(MD5Upper(plainText));
    167. System.out.println(MD5Lower(plainText, saltValue));
    168. System.out.println(MD5Upper(plainText, saltValue));
    169. System.out.println(MD5(plainText));
    170. System.out.println("=====校验结果======");
    171. System.out.println(valid(plainText,MD5(plainText)));
    172. }
    173. }

     

  • 相关阅读:
    Oracle-RAC集群不同节点数据查询不一致
    Spine Web Player教程
    华为电量分段图表实现过程
    智能驾驶ADAS算法设计及Prescan仿真(2): 自适应巡航ACC控制策略设计与simulink仿真
    基于Echarts实现可视化数据大屏科技业务数据统计
    22 多元正太总体的假设检验
    Linux命令--hexdump(以16进制查看文件内容)
    遥感指数数据库
    ubuntu开机系统出错且无法恢复。请联系系统管理员。
    进口猫罐头在排行榜中是否靠前?排行榜中靠前的猫罐头测评
  • 原文地址:https://blog.csdn.net/wanzhong_liao/article/details/133573293