RivaEDCode.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package com.yihu.wlyy.util;
  2. /**
  3. * Riva双向加密,解密算法实现
  4. * @author huangwenjie
  5. * @date 2018/1/27 14:36
  6. */
  7. public class RivaEDCode {
  8. /**
  9. * 16进制转换成10进制
  10. *
  11. * @param hexString 要进行转换的16进制数字字符串
  12. * @return Sring
  13. * @throws Exception
  14. */
  15. public static String hextoString(String hexString)
  16. {
  17. String hexStr = "";
  18. int i;
  19. int k = 0;
  20. int str1 = 0;
  21. int str2 = 0;
  22. // 每次取得两个16进制数字字符
  23. char str3 = hexString.charAt(0);
  24. char str4 = hexString.charAt(1);
  25. // 定义16进制字符所对应的数值,每个16进制数值对应为数组的索引值
  26. char myarray[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
  27. for(i = 0; i < myarray.length; i++)
  28. {
  29. // 对应16进制字符所对应的数值
  30. if(myarray[i] == str3)
  31. {
  32. str1 = i;
  33. }
  34. if(myarray[i] == str4)
  35. {
  36. str2 = i;
  37. }
  38. }
  39. // 换算成10进制数字
  40. k = str1 * 16 + str2;
  41. hexStr = Integer.toString(k);
  42. return hexStr;
  43. }
  44. /**
  45. * @param encode_str1 字符串一
  46. * @param encode_str2 需要加密的字符串
  47. * @return String 加密后的字符串
  48. * @throws Exception
  49. */
  50. public static String uncPassEncode(String encode_str1, String encode_str2)
  51. {
  52. String passString = "";
  53. String str = "";
  54. int userLens = encode_str1.length();
  55. int passLens = encode_str2.length();
  56. int userPos = 0;
  57. int passPos = 0;
  58. while (passPos < passLens)
  59. {
  60. char acii1 = encode_str2.charAt(passPos);
  61. char acii2 = encode_str1.charAt(userPos);
  62. str += Integer.toHexString(acii1 + acii2);
  63. userPos++;
  64. if(userPos >= userLens)
  65. userPos = 0;
  66. passPos++;
  67. }
  68. passString = str.toUpperCase();
  69. return passString;
  70. }
  71. /**
  72. * 解密用riva加密算法加密的字符串
  73. *
  74. * @param encode_str1 字符串
  75. * @param encode_str2 需要解密的密文
  76. * @return String 解密的明文
  77. * @throws Exception
  78. * @throws NumberFormatException
  79. * @throws Exception
  80. */
  81. public static String uncPassDecode(String encode_str1, String encode_str2)
  82. {
  83. String decodePassStr = "";
  84. // String en1;
  85. // String en2;
  86. int userLens = encode_str1.length();
  87. int passLens = encode_str2.length();
  88. int userPos = 0;
  89. int passPos = 0;
  90. while (passPos < passLens - 1)
  91. {
  92. /*
  93. * 16进制转换成10进制
  94. */
  95. int str1 = Integer.parseInt(hextoString(encode_str2.substring(passPos, passPos + 2)));
  96. int str2 = encode_str1.charAt(userPos);
  97. decodePassStr += String.valueOf((char)(str1 - str2));
  98. userPos++;
  99. if(userPos >= userLens)
  100. userPos = 0;
  101. passPos += 2;
  102. }
  103. return decodePassStr;
  104. }
  105. /**
  106. * 双重解密riva算法加密的密文
  107. *
  108. * @param str1 字符串1
  109. * @param str2 字符串2
  110. * @param key 加密的密文
  111. * @return String 解密后的明文
  112. * @throws Exception
  113. */
  114. public static String passDecode(String str1, String str2, String key)
  115. {
  116. return uncPassDecode(str1, uncPassDecode(str2, key));
  117. }
  118. /**
  119. * 利用riva加密算法双重加密字符串
  120. *
  121. * @param str1 字符串1
  122. * @param key 需要加密字符串
  123. * @param str2 字符串2
  124. * @return String 经过加密的字符串
  125. * @throws Exception
  126. */
  127. public static String passEncode(String str1, String str2, String key)
  128. {
  129. return uncPassEncode(str2, uncPassEncode(str1, key));
  130. }
  131. //测试-加密解密
  132. public static void main(String[] args)
  133. {
  134. //解密
  135. // System.out.println(RivaEDCode.passDecode("LUZ7TN3KOT8AWCD3ZA4NBMI5VNF7E50F6XYEP2WZM68JQYY5JE02L4L5FS9R4NGUGMHSCAPW9AL","C3SHUI8OWBOA4ZASS7FEYJ6RIVXA9SW6U5OA56ERUYZTRFHCRZO8AHT4TTW2MAGT80MGXN","7A778B7F8D8D6E918F7B87756A9B"));
  136. //加密
  137. // System.out.println(RivaEDCode.passEncode("LUZ7TN3KOT8AWCD3ZA4NBMI5VNF7E50F6XYEP2WZM68JQYY5JE02L4L5FS9R4NGUGMHSCAPW9AL","C3SHUI8OWBOA4ZASS7FEYJ6RIVXA9SW6U5OA56ERUYZTRFHCRZO8AHT4TTW2MAGT80MGXN","1234567"));
  138. }
  139. }