javascript - 尝试在 nodejs 中重新创建工作的 java 加密方法

标签 javascript java node.js encryption

我有一个可用的 Java 代码,用于使用 AES 加密 key 中的字符串,我一直在尝试在 Nodejs 中复制代码很长时间,但无法获得 Java 代码给我的确切 encrypted hash 输出。请让我知道我做错了什么。

加密.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 是所有魔法发生的文件,我无法在 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 );

使用的 key :a4e1112f45e84f785358bb86ba750f48
要加密的字符串:maharastra
预期哈希输出:81FD9101751D3F6632C0372E4BE257D1
非常感谢帮助。

最佳答案

let crypto = require('crypto');

var iv = new Buffer.from('');   //(null) iv 
var algorithm = 'aes-256-ecb';
var password = 'a4e1112f45e84f785358bb86ba750f48';      //key password for cryptography

function encrypt(buffer){
    var cipher = crypto.createCipheriv(algorithm,new Buffer(password),iv)
    var crypted = Buffer.concat([cipher.update(buffer),cipher.final()]);
    return crypted;
}

console.log(encrypt(new Buffer('TextToEncrypt')).toString())

关于javascript - 尝试在 nodejs 中重新创建工作的 java 加密方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60265445/

相关文章:

javascript - 如何每X秒自动刷新页面标题

java - 在 Java Swing 应用程序中实现 Spring Security

java - 如何在 Spring Boot 中配置外部配置 bean?

sql - 在 postgres 中使用 upsert 和 nodejs 中的 json 文件

javascript - 在 Vanilla 中切换风格

javascript - Grunt babel 没有为 IE 转换箭头函数

java - 如何在 JSP 中打印双引号?

javascript - 如何使用 async.series 等待响应?

node.js - NodeJS process.send 停止工作

javascript - 在指令中访问编译后的模板