【问题标题】:How to encrypt data in node.js using node-rsa and decrypt encrypted data in android?如何使用node-rsa加密node.js中的数据并解密android中的加密数据?
【发布时间】:2021-08-21 12:18:00
【问题描述】:

用于加密的 Node.js 代码

   function encrypt(msg) {
        try {
            const public_key = fs.readFileSync(path.join(__dirname, 'PublicKey.pem'), 'utf8');
            const encryptStr = crypto.publicEncrypt({
                key: public_key,
                padding: crypto.constants.RSA_PKCS1_PADDING
            }, Buffer.from(msg,'utf8'));
            let encryptString = encryptStr.toString('hex');
            return encryptString;
        } catch (e) {
            console.log(e);
            return false;
        }
    }

用于解密的Android代码

  public static String decryptStringWithPrivateKey(String s, String keyFilename)  throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        PrivateKey pkey = readPrivateKeyFromPem(keyFilename);

        cipher.init(Cipher.DECRYPT_MODE, pkey);
        String dec = new String(cipher.doFinal(Base64.getDecoder().decode(s)), "UTF-8");

        return dec;
    }


   public static PrivateKey readPrivateKeyFromPem(String keyFilename) throws Exception {
        byte[] keyBytes = Files.readAllBytes(new File(keyFilename).toPath());
        String keyString = new String(keyBytes);

        if (keyString.contains("BEGIN PRIVATE KEY")) {
            return readPrivateKeyFromPem_PKCS8(keyFilename);
        }
        else if(keyString.contains("BEGIN RSA PRIVATE KEY")){
            return readPrivateKeyFromPem_PKCS1(keyFilename);
        }
     
        throw new Exception("Unknown private key format in "+keyFilename);
    }

我想在服务器端加密api并在android设备上解密数据以避免未经授权的访问。

在 android 上解密时“输入字节数组在 172 处的结束字节不正确” 抛出这个错误。

【问题讨论】:

    标签: android node.js encryption


    【解决方案1】:

    在 NodeJS 代码中,密文是十六进制编码的,而在 Java 代码中,它是 Base64 解码的。这必须保持一致,无论是 Base64 还是两边的十六进制编码。

    另外,在 Java 代码中,当实例化密码时,只指定算法。这导致使用默认填充,例如在我的机器上(API 28,Android 9 Pie)对应于RSA/ECB/NoPadding。这与使用 PKCS#1 v1.5 填充的 NodeJS 端不兼容(除了没有填充的 RSA,所谓的教科书 RSA,是不安全的)。因此,还必须在密码实例化中使用RSA/ECB/PKCS1Padding 指定填充。

    使用 PKCS#8 格式的私钥和自己的 readPrivateKeyFromPem_PKCS8() 实现如果上述两个错误得到修复,这两个代码都可以在我的机器上运行。但是,未发布的方法也可能存在缺陷。

    【讨论】:

    • 你能提供一些示例代码吗?
    • 谢谢哥们,我得到了我想要的
    • 这是用于短数据加密或解密的有什么方法可以加密或解密大量数据
    • @VishalSarvaiya - 使用 RSA 只能加密数据,其长度最多与密钥大小一样大(实际上甚至更小,因为填充保留了一部分空间),例如对于 PKCS#1 v1.5 填充 (here),具有 2048 位密钥的消息可能只有 245 个字节长。对于较大的数据,使用hybrid encryption,即这里的数据使用 AES 等对称算法加密,对称密钥使用 RSA 等非对称算法加密。
    • 感谢您的重播,我明白了。如上所述,你能给我一个例子吗?所以我可以说得这么清楚..
    猜你喜欢
    • 2015-02-27
    • 2022-01-22
    • 2013-04-22
    • 2019-12-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    相关资源
    最近更新 更多