У меня есть рабочий Java код для шифрования строки в AES
шифровании с использованием key
, и я пытался повторить код в Nodejs
довольно долго, но не смог получить точный encrypted hash
вывод в виде Java кода дает мне. Пожалуйста, дайте мне знать, что я делаю неправильно.
Шифрование. java
@Component
public class WebSecurity {
@Autowired
Environment env;
private SecretKeySpec skeySpec;
private Cipher cipher;
public WebSecurity() {
skeySpec = null;
cipher = null;
}
public void initEncrypt(String key) throws Exception {
try {
skeySpec = new SecretKeySpec(HexUtil.HexfromString(key), "AES");
cipher = Cipher.getInstance("AES");
cipher.init(1, skeySpec);
} catch (NoSuchAlgorithmException nsae) {
throw new Exception("Invalid Java Version");
} catch (NoSuchPaddingException nse) {
throw new Exception("Invalid Key");
}
}
public String encrypt(String message,String enc_key) throws Exception {
try {
initEncrypt(enc_key);
byte encstr[] = cipher.doFinal(message.getBytes());
String encData = HexUtil.HextoString(encstr);
return java.net.URLEncoder.encode(encData);
} catch (BadPaddingException nse) {
throw new Exception("Invalid input String");
}
}
public static void main(String[] args) throws Exception {
System.out.println(new WebSecurity().encrypt("Charcoal Integration", "key here"));
}
}
Hexutil. java - это файл, в котором происходят все маги c, и я Я не могу повторить то же самое в nodejs.
public class HexUtil {
public HexUtil() {
}
public static byte[] HexfromString(String s) {
int i = s.length();
byte abyte0[] = new byte[(i + 1) / 2];
int j = 0;
int k = 0;
if (i % 2 == 1)
abyte0[k++] = (byte) HexfromDigit(s.charAt(j++));
while (j < i)
abyte0[k++] = (byte) (HexfromDigit(s.charAt(j++)) << 4 | HexfromDigit(s.charAt(j++)));
return abyte0;
}
public static int HexfromDigit(char c) {
if (c >= '0' && c <= '9')
return c - 48;
if (c >= 'A' && c <= 'F')
return (c - 65) + 10;
if (c >= 'a' && c <= 'f')
return (c - 97) + 10;
else
throw new IllegalArgumentException("invalid hex digit: " + c);
}
public static String HextoString(byte abyte0[], int i, int j) {
char ac[] = new char[j * 2];
int k = 0;
for (int l = i; l < i + j; l++) {
byte byte0 = abyte0[l];
ac[k++] = hexDigits[byte0 >>> 4 & 0xf];
ac[k++] = hexDigits[byte0 & 0xf];
}
return new String(ac);
}
public static String HextoString(byte abyte0[]) {
return HextoString(abyte0, 0, abyte0.length);
}
private static final char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
}
Это код nodejs, который я пробовал.
Шифрование. js
let crypto = require('crypto');
var util= require('util');
var encoder=new util.TextEncoder();
var encryptKey = function (text, algorithm) {
var cipher = crypto.createCipher(algorithm, HexfromString('a4e11920212a47d85358bb86ba75abcd').toString('hex'));
// console.log(HexfromString('a4e11920212a47d85358bb86ba750f37').toString('binary'))
// var encstr = cipher.final(text).toString(2);
// console.log(test);
var abc=text.split('').map(s);
// console.log('abc : ',(abc[0] >>> 0).toString(2))
var crypted = cipher.update(HextoString(encoder.encode(String(text).getBytes())),'utf8', 'hex')
crypted += cipher.final('hex');
return crypted;
}
function s(x) {return x.charCodeAt(0);}
var HexfromString = function(s){
var i = s.length;
var abyte0 = [(i + 1) / 2];
var j = 0;
var k = 0;
if (i % 2 == 1){
abyte0[k++] = HexfromDigit(new Buffer(s.charAt(j++)));
}
while (j < i){
// console.log('hex : ',HexfromDigit(s.charAt(j++)).toString(2))
abyte0[k++] = (HexfromDigit(s.charAt(j++)) << 4 | HexfromDigit(s.charAt(j++))).toString(2)
}
return abyte0;
}
function getSignedInteger(bits) {
return bits.length === 8 && +bits[0]
? ~(parseInt(bits, 2) ^ 255)
: parseInt(bits, 2);
}
var HexfromDigit = function(a) {
var c = a.charCodeAt(0);
// console.log('a: ',a, ' c : ',c);
if (c >= '0'.charCodeAt(0) && c <= '9'.charCodeAt(0))
return c - 48;
if (c >= 'A'.charCodeAt(0) && c <= 'F'.charCodeAt(0))
return (c - 65) + 10;
if (c >= 'a'.charCodeAt(0) && c <= 'f'.charCodeAt(0))
return (c - 97) + 10;
else
console.log('invalid hex digit', c)
}
var HextoStrings = function(abyte0, i, j) {
console.log(abyte0)
var tempArr=[j * 2]
var k = 0;
for (var l = i; l < j; l++) {
var byte0 = abyte0[l];
tempArr[k++] = hexDigits[byte0 >>> 4 & 0xf];
tempArr[k++] = hexDigits[byte0 & 0xf];
// console.log(hexDigits[byte0 >>> 4 & 0xf])
// console.log(tempArr, k)
}
// console.log(tempArr);
return String(tempArr);
}
var HextoString = function(abyte0) {
return HextoStrings(abyte0, 0, abyte0.length);
}
// var hexDigits = '0123456789ABCDEF';
var hexDigits = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' ];
var valEncrypt = encryptKey('charcoaleats', 'aes-256-ecb');
var encodedEnVal = encodeURI(valEncrypt);
console.log( 'encrypt : ',encodedEnVal );
Используемый ключ: a4e1112f45e84f785358bb86ba750f48
Строка для шифрования: maharastra
Ожидаемое значение Ха sh Вывод: 81FD9101751D3F6632C0372E4BE257D1
Помощь очень ценится.