ノード-RSAのjava-RSA対応する公開鍵と秘密鍵の暗号化と復号化と生成されたRSA

そしてサードパーティのドッキング、それは同じ言語ではないかもしれない、対応する暗号化方式は、相互運用性の暗号化方式を実現する方法を、それぞれ異なるここでは、JavaのノードでこのレコードRSA暗号になります実装することができ、トーク安い、であなたのコードを表示:

***注!!! SSLキーの生成時には、Javaは、キーpkcs8.pemフォーマットの使用であり、我々は直接private.pemフォーマットをすることができ、他の言語を使用します

SSL鍵生成のbashを取り付けます。

OpenSSL> genrsa -out rsa_private_key.pem   1024  #生成私钥
OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem #Java开发者需要将私钥转换成PKCS8格式
OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem #生成公钥
OpenSSL> exit #退出OpenSSL程序

Javaでは、私たちは、進を使用し、暗号化と復号化のための六角レンチであります:

//公钥加密方法如下
public static String encryptByPublicKey(String content, String key) throws Exception {
        byte[] keyBytes = ConvertUtil.hexStrToBytes(key);
        byte[] data = content.getBytes("UTF-8");
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        Key publicKey = keyFactory.generatePublic(x509KeySpec);
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(1, publicKey);
        int inputLen = data.length;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int offSet = 0;

        byte[] cache;
        for(int i = 0; inputLen - offSet > 0; offSet = i * 117) {
            if (inputLen - offSet > 117) {
                cache = cipher.doFinal(data, offSet, 117);
            } else {
                cache = cipher.doFinal(data, offSet, inputLen - offSet);
            }

            out.write(cache, 0, cache.length);
            ++i;
        }

        cache = out.toByteArray();
        out.close();
        return ConvertUtil.bytesToHexStr(cache);
    }
//私钥解密方法如下
public static String decryptByPrivateKey(String content, String key) throws Exception {
        byte[] keyBytes = ConvertUtil.hexStrToBytes(key);
        byte[] data = ConvertUtil.hexStrToBytes(content);
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(2, privateKey);
        int inputLen = data.length;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int offSet = 0;

        byte[] cache;
        for(int i = 0; inputLen - offSet > 0; offSet = i * 128) {
            if (inputLen - offSet > 128) {
                cache = cipher.doFinal(data, offSet, 128);
            } else {
                cache = cipher.doFinal(data, offSet, inputLen - offSet);
            }

            out.write(cache, 0, cache.length);
            ++i;
        }

        cache = out.toByteArray();
        out.close();
        return new String(cache, 0, cache.length, "UTF-8");
    }

対応するノードが、私たちは書くことができます次に、あなたがに対応する暗号化コンテンツ生成されたJavaコードの暗号化と復号化することができます:

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

//解密 解密我们使用node-rsa,因为crypto所支持的解密密文长度有限,需要自己转换否则可能报错
function decrypt(msg) {
    try {
        let private_key = fs.readFileSync(path.join(__dirname, '/certs/xxxx_private_key.pem'), 'utf8');
        var privatedecrypt= new NodeRSA(private_key,{encryptionScheme: 'pkcs1'});
        var decrypted = privatedecrypt.decrypt(Buffer.from(msg,'hex'), 'utf8',);
    } catch (e) {
        console.log(e);
        return false;
    }
}

それは単純ではないですか?しかし、それは、問題の長さがありませんでした、本当に多くの労力を費やしている0..0

お読みいただき、ありがとうございました!記事に誤りがある場合は、あなたがよりよく理解や提案がある場合、または、私に連絡してください!

公開された29元の記事 ウォン称賛18 ビュー30000 +

おすすめ

転載: blog.csdn.net/Baby_lucy/article/details/89669202