123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- package com.yihu.wlyy.util;
- /**
- * Riva双向加密,解密算法实现
- * @author huangwenjie
- * @date 2018/1/27 14:36
- */
- public class RivaEDCode {
- /**
- * 16进制转换成10进制
- *
- * @param hexString 要进行转换的16进制数字字符串
- * @return Sring
- * @throws Exception
- */
- public static String hextoString(String hexString)
- {
-
- String hexStr = "";
-
- int i;
- int k = 0;
-
- int str1 = 0;
- int str2 = 0;
-
- // 每次取得两个16进制数字字符
- char str3 = hexString.charAt(0);
- char str4 = hexString.charAt(1);
-
- // 定义16进制字符所对应的数值,每个16进制数值对应为数组的索引值
- char myarray[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
-
- for(i = 0; i < myarray.length; i++)
- {
- // 对应16进制字符所对应的数值
- if(myarray[i] == str3)
- {
- str1 = i;
- }
-
- if(myarray[i] == str4)
- {
- str2 = i;
- }
- }
-
- // 换算成10进制数字
- k = str1 * 16 + str2;
-
- hexStr = Integer.toString(k);
-
- return hexStr;
- }
-
- /**
- * @param encode_str1 字符串一
- * @param encode_str2 需要加密的字符串
- * @return String 加密后的字符串
- * @throws Exception
- */
- public static String uncPassEncode(String encode_str1, String encode_str2)
- {
-
- String passString = "";
-
- String str = "";
- int userLens = encode_str1.length();
- int passLens = encode_str2.length();
-
- int userPos = 0;
- int passPos = 0;
-
- while (passPos < passLens)
- {
-
- char acii1 = encode_str2.charAt(passPos);
- char acii2 = encode_str1.charAt(userPos);
-
- str += Integer.toHexString(acii1 + acii2);
- userPos++;
-
- if(userPos >= userLens)
- userPos = 0;
- passPos++;
- }
-
- passString = str.toUpperCase();
-
- return passString;
- }
-
-
- /**
- * 解密用riva加密算法加密的字符串
- *
- * @param encode_str1 字符串
- * @param encode_str2 需要解密的密文
- * @return String 解密的明文
- * @throws Exception
- * @throws NumberFormatException
- * @throws Exception
- */
- public static String uncPassDecode(String encode_str1, String encode_str2)
- {
-
- String decodePassStr = "";
- // String en1;
- // String en2;
-
- int userLens = encode_str1.length();
- int passLens = encode_str2.length();
-
- int userPos = 0;
- int passPos = 0;
-
- while (passPos < passLens - 1)
- {
- /*
- * 16进制转换成10进制
- */
- int str1 = Integer.parseInt(hextoString(encode_str2.substring(passPos, passPos + 2)));
-
- int str2 = encode_str1.charAt(userPos);
-
- decodePassStr += String.valueOf((char)(str1 - str2));
-
- userPos++;
-
- if(userPos >= userLens)
- userPos = 0;
-
- passPos += 2;
- }
-
- return decodePassStr;
- }
-
- /**
- * 双重解密riva算法加密的密文
- *
- * @param str1 字符串1
- * @param str2 字符串2
- * @param key 加密的密文
- * @return String 解密后的明文
- * @throws Exception
- */
- public static String passDecode(String str1, String str2, String key)
- {
-
- return uncPassDecode(str1, uncPassDecode(str2, key));
-
- }
-
- /**
- * 利用riva加密算法双重加密字符串
- *
- * @param str1 字符串1
- * @param key 需要加密字符串
- * @param str2 字符串2
- * @return String 经过加密的字符串
- * @throws Exception
- */
- public static String passEncode(String str1, String str2, String key)
- {
-
- return uncPassEncode(str2, uncPassEncode(str1, key));
-
- }
-
-
- //测试-加密解密
- public static void main(String[] args)
- {
- //解密
- // System.out.println(RivaEDCode.passDecode("LUZ7TN3KOT8AWCD3ZA4NBMI5VNF7E50F6XYEP2WZM68JQYY5JE02L4L5FS9R4NGUGMHSCAPW9AL","C3SHUI8OWBOA4ZASS7FEYJ6RIVXA9SW6U5OA56ERUYZTRFHCRZO8AHT4TTW2MAGT80MGXN","7A778B7F8D8D6E918F7B87756A9B"));
-
- //加密
- // System.out.println(RivaEDCode.passEncode("LUZ7TN3KOT8AWCD3ZA4NBMI5VNF7E50F6XYEP2WZM68JQYY5JE02L4L5FS9R4NGUGMHSCAPW9AL","C3SHUI8OWBOA4ZASS7FEYJ6RIVXA9SW6U5OA56ERUYZTRFHCRZO8AHT4TTW2MAGT80MGXN","1234567"));
- }
- }
|