如何使用node-rsa加密node.js中的数据并解密android中的加密数据?

维沙尔萨瓦亚

用于加密的 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处有不正确的结束字节”,但会抛出这个错误。

托帕科

在 NodeJS 代码中,密文采用十六进制编码,在 Java 代码中采用 Base64 解码。这必须是一致的,两边都是 Base64 或十六进制编码。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

node.js:加密需要解密的数据?

我在 node.js 中使用 crypto 模块加密了数据,如何使用 crypto-js 在 react.js 中解密

Android中的AES加密和Node.js中的解密

使用AESCrypt在Android中加密数据并在Ruby中解密

使用Node.js加密模块加密并使用Java解密(在Android应用中)

为什么在C#中加密后,node.js中的RSA解密失败?

Node JS - 加密/解密

使用RSA-OAEP解密用JavaScript加密的C#中的数据时,OAEP填充错误

RSA如何加密/解密?

PHP中的加密和node.js中的解密

MongoDB社区-Node JS中的静态数据加密

在Coldfusion中加密,在Node.js中解密

Node.js中的AES加密和Scala上的解密

在使用C#加密的PostgreSQL查询中解密数据

使用Objective-C加密数据并在Python中解密

解密使用python加密的打字稿中的数据

如何使用python中的RSA私钥加密数据?

C ++和node.js之间的RSA加密

BadPaddingException在Android中解密加密的数据

使用node-forge进行加密,并使用python和RSA-OAEP进行解密

使用Windows AES加密提供程序解密C ++中的C#加密数据

c(加密消息)如何通过RSA中的私钥解密?

使用加密加密后无法解密数据

如何使用RSA加密在C ++中加密大数据

使用node-jose,如何解密刚刚加密的数据?

如何对Samba共享中的文件夹中的数据进行加密,以及共享加密和解密的数据?

在Java中加密字符串,在node.js中解密,错误:解密错误

解密大量RSA加密数据

使用AES 256 CTR在Node JS中加密和在Golang中解密