【问题标题】:How to decrypt data sent from Android (Java) using Node.Js如何使用 Node.Js 解密从 Android (Java) 发送的数据
【发布时间】:2018-01-12 16:13:14
【问题描述】:

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

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;
    }
}

我需要在 Node.Js 上编写代码来解密这些加密数据。到目前为止 - 我想出了

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);
}

我一直在遇到

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

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

public static String decryptData(final String data, final String password) throws Exception {
        MessageDigest instance=MessageDigest.getInstance("SHA-1");
        byte[] passworddigest=instance.digest(password.getBytes("utf-8"));
        byte[] key=Arrays.copyOf(passworddigest, 24);
        final SecretKeySpec secretKeySpec = new SecretKeySpec(key, "DESede");

        final byte[] decodeddata = Base64.decode(data.getBytes("utf-8"), Base64.DEFAULT);

        final Cipher ciperInstance = Cipher.getInstance("DESede");
        ciperInstance.init(DECRYPT_MODE, secretKeySpec);
        byte[] res= ciperInstance.doFinal(decodeddata);

        return new String(res, "UTF-8");
    }

您能帮我在 Node 中翻译一下吗?

【问题讨论】:

    标签: android node.js encryption cryptography


    【解决方案1】:

    经过一番研究并撞到了它 - 我终于想出了一些可行的方法

    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 - 我传递了 '' 的值。 在 Java (Android) 中,DESede 实际上是 TripleDES,加密上的等价物是“des-ede3”而不是“des-ede”。 我希望这可以为某人节省几个小时。

    【讨论】:

    • 1.给定相同输入的 MD5 将产生相同的输出。 2. 如果要为双方创建加密,不使用 3DES (des-ede3),请使用 AES。使用随机 IV,只需在加密数据前加上它,IV 不需要保密。如果您使用 ECB 模式:不要,它不安全,ECB 模式不使用 IV。
    • 我不能随意更改加密逻辑。
    猜你喜欢
    • 2021-08-21
    • 2021-12-15
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多