如何使用Node.Js解密从Android(Java)发送的数据

时间:2018-01-12 16:13:15

标签: android node.js encryption cryptography

我遇到了一个问题 - 现有程序使用下面的代码来加密数据

"git clone https://", { "Ref": "GitLabUsn" },":", { "Ref": "GitLabPwd" },"@gitlab.com/user/repository.git \n"

我需要在Node.Js上编写解密此加密数据的代码。到目前为止 - 我已经提出了

public static String encryptData(String data, final String key) {
    try {
        byte[] kb=key.getBytes("utf-8");
        byte[] dig= MessageDigest.getInstance("SHA-1").digest(kb);
        byte[] kdig= Arrays.copyOf(dig, 24);
        final SecretKeySpec secretKeySpec = new SecretKeySpec(kdig, "DESede");

        final Cipher instance = Cipher.getInstance("DESede");
        instance.init(ENCRYPT_MODE, secretKeySpec);

        byte[] ecb=instance.doFinal(data.getBytes("utf-8"));
        byte[] enb64=Base64.encode(ecb, Base64.DEFAULT);
        return new String(enb64);
    } catch (Exception ex) {
        ErmsLogger.e(TAG, ex.getMessage());
        return null;
    }
}

我继续遇到

function decryptData(encrpted_data,fn){
    var hashedKey = crypto.createHash('sha1').update(config.dataPassword).digest('hex');

    if(hashedKey.length < 48){
        var num=48 - hashedKey.length;
        for(var i=0;i < num; i++){
            hashedKey +='0';
        }
    }

    var key=Buffer.from(hashedKey, 'hex');

    var decipher   = crypto.createDecipher('des-ede', key);
    decoded        = decipher.update(encrpted_data, 'base64', 'utf8');
    decoded       += decipher.final('utf8');
    log.debug(JSON.stringify(decoded));

    return fn(decoded);
}

每当我尝试解密从Android应用程序发送的数据时。 Android(Java)上的工作解密代码是

Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
    at Decipher.final (internal/crypto/cipher.js:104:26)

你能协助我在Node中翻译吗?

1 个答案:

答案 0 :(得分:0)

经过一番研究并对抗它之后 - 我终于想出了一些有用的东西

function decryptData(encrpted_data,fn){

    var encodeKey   = crypto.createHash('sha1').update(config.dataPassword).digest('hex');
    var cryptkey=Buffer.alloc(24);
    encodeKey.copy(cryptkey);

    var decipher = crypto.createDecipheriv('des-ede3', cryptkey,'');
    decipher.setAutoPadding(true);
    decoded  = decipher.update(encrpted_data, 'base64', 'utf8');
    decoded += decipher.final('utf8');

    log.debug(JSON.stringify(decoded));

    return fn(decoded);
}

解释 - crypto.createDecipher() - 内部使用MD5哈希作为传递给它的密钥,因此发送的密钥值实际上并不重要 - 它将被更改。所以最好的选择是使用接受原始密钥的createDecipheriv。这允许你在传入之前将你的密钥哈希在外面。由于我没有使用任何IV - 我传递了&#39;&#39;的值。 在Java(Android)中,DESede实际上是TripleDES,而在crypto上的等价物是&#39; des-ede3&#39;而不是&#39; des-ede&#39;。 我希望这能节省几个小时。