Shell   发布时间:2019-11-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了[Linux] 使用openssl实现RSA非对称加密大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

简单定义:公钥和私钥,加密和解密使用的是两个不同的密钥,所以是非对称

系统:ubuntu 14.04

软件:openssl java php

生成公钥私钥

使用命令生成私钥:

参数:genrsa 生成密钥   -out 输出到文件  rsa_private_key.pem 文件名  1024 长度

从私钥中提取公钥:

参数: rsa 提取公钥  -in 从文件中读入  rsa_private_key.pem 文件名   -pubout  输出   -out 到文件  rsa_public_key.pem  文件名

sHell加解密

新建一个readme.txt 内容是taoshihan

使用公钥加密:

Hello.en

参数: rsautl 加解密  -encrypt 加密  -in 从文件输入  readme.txt 文件名  -inkey  输入的密钥  rsa_public_key.pem  上一步生成的公钥  -pubin 表名输入是公钥文件  -out输出到文件  Hello.en 输出文件名

使用私钥解密:

Hello.en -inkey rsa_private_key.pem -out Hello.de

参数: -decrypt 解密  -in 从文件输入 Hello.en 上一步生成的加密文件  -inkey 输入的密钥 rsa_private_key.pem 上一步生成的私钥  -out输出到文件  Hello.de 输出的文件名

Hello.de // taoshihan

php加解密

="taoshihan" "加密前:{}\n" =("rsa_public_key.pem"); = openssl_pkey_get_public(); openssl_public_encrypt(,,); =(); "加密后:\n" ."\n"<span style="color: #008000">//<span style="color: #008000">私钥解密
<span style="color: #800080">$private_key
=<span style="color: #008080">file_get_contents
("rsa_private_key.pem"<span style="color: #000000">);
<span style="color: #800080">$pi_key
= openssl_pkey_get_private(<span style="color: #800080">$private_key
<span style="color: #000000">);
openssl_private_decrypt(
<span style="color: #008080">base64_decode
(<span style="color: #800080">$encrypted
),<span style="color: #800080">$decrypted
,<span style="color: #800080">$pi_key
<span style="color: #000000">);
<span style="color: #0000ff">echo
"解密后:\n"<span style="color: #000000">;
<span style="color: #0000ff">echo
<span style="color: #800080">$decrypted
."\n";

新建rsa.php的文件

执行后结果:

php;gutter:true;">加密前:taoshihan 加密后: ShjsdlTceurVfO0ocENqHGl9RXrQRm3vuprqchhuVOdX1ldJC2O2sIvjjpQfPWOkF1WA+tqdyIl9YJQ0/2DqAp4zaqI1TCNsXduGn2iUZQ88g7B5eSI7r/iWKcX527pLe95EBvFMw/D65tlYscI5RClcp3KrOw2fqDQZ3D3nKai= 解密后: taoshihan

java加解密:

准备jar包 bcprov-ext-jdk15on-156.jar

http://www.bouncycastle.org/download/bcprov-ext-jdk15on-156.jar

RSAEncrypt.java 文件

.bufferedReader; LeoutputStream; s.RSAPrivateKey; s.RSAPublicKey; c; c; s.RSAPrivateKey; c;

<span style="color: #0000ff">import<span style="color: #000000"> org.bouncycastle.asn1.ASN1Sequence;
<span style="color: #0000ff">import<span style="color: #000000"> org.bouncycastle.asn1.pkcs.RSAPrivateKeyStructure;

<span style="color: #0000ff">import<span style="color: #000000"> javax.crypto.badPaddingException;
<span style="color: #0000ff">import<span style="color: #000000"> javax.crypto.Cipher;
<span style="color: #0000ff">import<span style="color: #000000"> javax.crypto.IllegalBlockSizeException;
<span style="color: #0000ff">import<span style="color: #000000"> javax.crypto.NoSuchPaddingException;

<span style="color: #0000ff">import<span style="color: #000000"> org.bouncycastle.jce.provider.bouncyCastleProvider;

<span style="color: #0000ff">import<span style="color: #000000"> sun.misc.bASE64Decoder;
<span style="color: #0000ff">import<span style="color: #000000"> sun.misc.bASE64Encoder;

<span style="color: #0000ff">public <span style="color: #0000ff">class<span style="color: #000000"> RSAEncrypt {
<span style="color: #008000">/**<span style="color: #008000">

  • 私钥
    <span style="color: #008000">*/
    <span style="color: #0000ff">private<span style="color: #000000"> RSAPrivateKey privateKey;
</span><span style="color: #008000"&gt;/**</span><span style="color: #008000"&gt;
 * 公钥
 </span><span style="color: #008000"&gt;*/</span>
<span style="color: #0000ff"&gt;private</span><span style="color: #000000"&gt; RSAPublicKey publicKey;

</span><span style="color: #008000"&gt;/**</span><span style="color: #008000"&gt;
 * 字节数据转字符串专用集合
 </span><span style="color: #008000"&gt;*/</span>
<span style="color: #0000ff"&gt;private</span> <span style="color: #0000ff"&gt;static</span> <span style="color: #0000ff"&gt;final</span> <span style="color: #0000ff"&gt;char</span>[] HEX_CHAR= {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'<span style="color: #000000"&gt;};


</span><span style="color: #008000"&gt;/**</span><span style="color: #008000"&gt;
 * 获取私钥
 * </span><span style="color: #808080"&gt;@return</span><span style="color: #008000"&gt; 当前的私钥对象
 </span><span style="color: #008000"&gt;*/</span>
<span style="color: #0000ff"&gt;public</span><span style="color: #000000"&gt; RSAPrivateKey getPrivateKey() {
    </span><span style="color: #0000ff"&gt;return</span><span style="color: #000000"&gt; privateKey;
}

</span><span style="color: #008000"&gt;/**</span><span style="color: #008000"&gt;
 * 获取公钥
 * </span><span style="color: #808080"&gt;@return</span><span style="color: #008000"&gt; 当前的公钥对象
 </span><span style="color: #008000"&gt;*/</span>
<span style="color: #0000ff"&gt;public</span><span style="color: #000000"&gt; RSAPublicKey getPublicKey() {
    </span><span style="color: #0000ff"&gt;return</span><span style="color: #000000"&gt; publicKey;
}

</span><span style="color: #008000"&gt;/**</span><span style="color: #008000"&gt;
 * 随机生成密钥对
 </span><span style="color: #008000"&gt;*/</span>
<span style="color: #0000ff"&gt;public</span> <span style="color: #0000ff"&gt;void</span><span style="color: #000000"&gt; genKeyPair(){
    KeyPairGenerator keyPairGen</span>= <span style="color: #0000ff"&gt;null</span><span style="color: #000000"&gt;;
    </span><span style="color: #0000ff"&gt;try</span><span style="color: #000000"&gt; {
        keyPairGen</span>= KeyPairGenerator.geTinstance("RSA"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (NoSuchAlgorithmException E) {
        e.printStackTrace();
    }
    keyPairGen.initialize(</span>1024,<span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; SecureRandom());
    KeyPair keyPair</span>=<span style="color: #000000"&gt; keyPairGen.generateKeyPair();
    </span><span style="color: #0000ff"&gt;this</span>.privateKey=<span style="color: #000000"&gt; (RSAPrivateKey) keyPair.getPrivate();
    </span><span style="color: #0000ff"&gt;this</span>.publicKey=<span style="color: #000000"&gt; (RSAPublicKey) keyPair.getPublic();
}

</span><span style="color: #008000"&gt;/**</span><span style="color: #008000"&gt;
 * 从文件中输入流中加载公钥
 * </span><span style="color: #808080"&gt;@param</span><span style="color: #008000"&gt; in 公钥输入流
 * </span><span style="color: #808080"&gt;@throws</span><span style="color: #008000"&gt; Exception 加载公钥时产生的异常
 </span><span style="color: #008000"&gt;*/</span>
<span style="color: #0000ff"&gt;public</span> <span style="color: #0000ff"&gt;void</span> loadPublicKey(InputStream in) <span style="color: #0000ff"&gt;throws</span><span style="color: #000000"&gt; Exception{
    </span><span style="color: #0000ff"&gt;try</span><span style="color: #000000"&gt; {
        BufferedReader br</span>= <span style="color: #0000ff"&gt;new</span> BufferedReader(<span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; InputStreamReader(in));
        String readLine</span>= <span style="color: #0000ff"&gt;null</span><span style="color: #000000"&gt;;
        StringBuilder sb</span>= <span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; StringBuilder();
        </span><span style="color: #0000ff"&gt;while</span>((readLine= br.readLine())!=<span style="color: #0000ff"&gt;null</span><span style="color: #000000"&gt;){
            </span><span style="color: #0000ff"&gt;if</span>(readLine.charAt(0)=='-'<span style="color: #000000"&gt;){
                </span><span style="color: #0000ff"&gt;conTinue</span><span style="color: #000000"&gt;;
            }</span><span style="color: #0000ff"&gt;else</span><span style="color: #000000"&gt;{
                sb.append(readLinE);
                sb.append(</span>'\r'<span style="color: #000000"&gt;);
            }
        }
        loadPublicKey(sb.toString());
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (IOException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("公钥数据流读取错误"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (NullPointerException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("公钥输入流为空"<span style="color: #000000"&gt;);
    }
}


</span><span style="color: #008000"&gt;/**</span><span style="color: #008000"&gt;
 * 从字符串中加载公钥
 * </span><span style="color: #808080"&gt;@param</span><span style="color: #008000"&gt; publicKeyStr 公钥数据字符串
 * </span><span style="color: #808080"&gt;@throws</span><span style="color: #008000"&gt; Exception 加载公钥时产生的异常
 </span><span style="color: #008000"&gt;*/</span>
<span style="color: #0000ff"&gt;public</span> <span style="color: #0000ff"&gt;void</span> loadPublicKey(String publicKeyStr) <span style="color: #0000ff"&gt;throws</span><span style="color: #000000"&gt; Exception{
    </span><span style="color: #0000ff"&gt;try</span><span style="color: #000000"&gt; {
        BASE64Decoder base64Decoder</span>= <span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; BASE64Decoder();
        </span><span style="color: #0000ff"&gt;byte</span>[] buffer=<span style="color: #000000"&gt; base64Decoder.decodeBuffer(publicKeyStr);
        KeyFactory keyFactory</span>= KeyFactory.geTinstance("RSA"<span style="color: #000000"&gt;);
        X509EncodedKeySpec keySpec</span>= <span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; X509EncodedKeySpec(buffer);
        </span><span style="color: #0000ff"&gt;this</span>.publicKey=<span style="color: #000000"&gt; (RSAPublicKey) keyFactory.generatePublic(keySpec);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (NoSuchAlgorithmException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("无此算法"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (InvalidKeySpecException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("公钥非法"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (IOException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("公钥数据内容读取错误"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (NullPointerException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("公钥数据为空"<span style="color: #000000"&gt;);
    }
}

</span><span style="color: #008000"&gt;/**</span><span style="color: #008000"&gt;
 * 从文件中加载私钥
 * </span><span style="color: #808080"&gt;@param</span><span style="color: #008000"&gt; keyFilename 私钥文件名
 * </span><span style="color: #808080"&gt;@return</span><span style="color: #008000"&gt; 是否成功
 * </span><span style="color: #808080"&gt;@throws</span><span style="color: #008000"&gt; Exception 
 </span><span style="color: #008000"&gt;*/</span>
<span style="color: #0000ff"&gt;public</span> <span style="color: #0000ff"&gt;void</span> loadPrivateKey(InputStream in) <span style="color: #0000ff"&gt;throws</span><span style="color: #000000"&gt; Exception{
    </span><span style="color: #0000ff"&gt;try</span><span style="color: #000000"&gt; {
        BufferedReader br</span>= <span style="color: #0000ff"&gt;new</span> BufferedReader(<span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; InputStreamReader(in));
        String readLine</span>= <span style="color: #0000ff"&gt;null</span><span style="color: #000000"&gt;;
        StringBuilder sb</span>= <span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; StringBuilder();
        </span><span style="color: #0000ff"&gt;while</span>((readLine= br.readLine())!=<span style="color: #0000ff"&gt;null</span><span style="color: #000000"&gt;){
            </span><span style="color: #0000ff"&gt;if</span>(readLine.charAt(0)=='-'<span style="color: #000000"&gt;){
                </span><span style="color: #0000ff"&gt;conTinue</span><span style="color: #000000"&gt;;
            }</span><span style="color: #0000ff"&gt;else</span><span style="color: #000000"&gt;{
                sb.append(readLinE);
                sb.append(</span>'\r'<span style="color: #000000"&gt;);
            }
        }
        loadPrivateKey(sb.toString());
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (IOException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("私钥数据读取错误"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (NullPointerException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("私钥输入流为空"<span style="color: #000000"&gt;);
    }
}

</span><span style="color: #0000ff"&gt;public</span> <span style="color: #0000ff"&gt;void</span> loadPrivateKey(String privateKeyStr) <span style="color: #0000ff"&gt;throws</span><span style="color: #000000"&gt; Exception{
    </span><span style="color: #0000ff"&gt;try</span><span style="color: #000000"&gt; {
        BASE64Decoder base64Decoder</span>= <span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; BASE64Decoder();
        </span><span style="color: #0000ff"&gt;byte</span>[] buffer=<span style="color: #000000"&gt; base64Decoder.decodeBuffer(privateKeyStr);

        RSAPrivateKeyStructure asn1PrivKey </span>= <span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; RSAPrivateKeyStructure((ASN1SequencE) ASN1Sequence.fromByteArray(buffer));
        RSAPrivateKeySpec rsaPrivKeySpec </span>= <span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; RSAPrivateKeySpec(asn1PrivKey.getModulus(),asn1PrivKey.getPrivateExponent());
        KeyFactory keyFactory</span>= KeyFactory.geTinstance("RSA"<span style="color: #000000"&gt;);
        RSAPrivateKey  priKey</span>=<span style="color: #000000"&gt;(RSAPrivateKey) keyFactory.generatePrivate(rsaPrivKeySpec);
        </span><span style="color: #0000ff"&gt;this</span>.privateKey=<span style="color: #000000"&gt;priKey;

        </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; PKCS8EncodedKeySpec keySpec= new PKCS8EncodedKeySpec(buffer);
        </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; KeyFactory keyFactory= KeyFactory.geTinstance("RSA");
        </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt;this.privateKey= (RSAPrivateKey) keyFactory.generatePrivate(keySpec);</span>
    } <span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (NoSuchAlgorithmException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("无此算法"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (InvalidKeySpecException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("私钥非法"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (IOException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("私钥数据内容读取错误"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (NullPointerException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("私钥数据为空"<span style="color: #000000"&gt;);
    }
}

</span><span style="color: #008000"&gt;/**</span><span style="color: #008000"&gt;
 * 加密过程
 * </span><span style="color: #808080"&gt;@param</span><span style="color: #008000"&gt; publicKey 公钥
 * </span><span style="color: #808080"&gt;@param</span><span style="color: #008000"&gt; plaintextData 明文数据
 * </span><span style="color: #808080"&gt;@return</span><span style="color: #008000"&gt;
 * </span><span style="color: #808080"&gt;@throws</span><span style="color: #008000"&gt; Exception 加密过程中的异常信息
 </span><span style="color: #008000"&gt;*/</span>
<span style="color: #0000ff"&gt;public</span> <span style="color: #0000ff"&gt;byte</span>[] encrypt(RSAPublicKey publicKey,<span style="color: #0000ff"&gt;byte</span>[] plaintextData) <span style="color: #0000ff"&gt;throws</span><span style="color: #000000"&gt; Exception{
    </span><span style="color: #0000ff"&gt;if</span>(publicKey== <span style="color: #0000ff"&gt;null</span><span style="color: #000000"&gt;){
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("加密公钥为空,请设置"<span style="color: #000000"&gt;);
    }
    Cipher cipher</span>= <span style="color: #0000ff"&gt;null</span><span style="color: #000000"&gt;;
    </span><span style="color: #0000ff"&gt;try</span><span style="color: #000000"&gt; {
        cipher</span>= Cipher.geTinstance("RSA/ECB/PKCS1Padding",<span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; BouncyCastleProvider());
        cipher.init(Cipher.ENCRYPT_MODE,publicKey);
        </span><span style="color: #0000ff"&gt;byte</span>[] output=<span style="color: #000000"&gt; cipher.doFinal(plaintextData);
        </span><span style="color: #0000ff"&gt;return</span><span style="color: #000000"&gt; output;
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (NoSuchAlgorithmException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("无此加密算法"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (NoSuchPaddingException E) {
        e.printStackTrace();
        </span><span style="color: #0000ff"&gt;return</span> <span style="color: #0000ff"&gt;null</span><span style="color: #000000"&gt;;
    }</span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (InvalidKeyException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("加密公钥非法,请检查"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (IllegalBlockSizeException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("明文长度非法"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (BadPaddingException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("明文数据已损坏"<span style="color: #000000"&gt;);
    }
}

</span><span style="color: #008000"&gt;/**</span><span style="color: #008000"&gt;
 * 解密过程
 * </span><span style="color: #808080"&gt;@param</span><span style="color: #008000"&gt; privateKey 私钥
 * </span><span style="color: #808080"&gt;@param</span><span style="color: #008000"&gt; cipherData 密文数据
 * </span><span style="color: #808080"&gt;@return</span><span style="color: #008000"&gt; 明文
 * </span><span style="color: #808080"&gt;@throws</span><span style="color: #008000"&gt; Exception 解密过程中的异常信息
 </span><span style="color: #008000"&gt;*/</span>
<span style="color: #0000ff"&gt;public</span> <span style="color: #0000ff"&gt;byte</span>[] decrypt(RSAPrivateKey privateKey,<span style="color: #0000ff"&gt;byte</span>[] cipherData) <span style="color: #0000ff"&gt;throws</span><span style="color: #000000"&gt; Exception{
    </span><span style="color: #0000ff"&gt;if</span> (privateKey== <span style="color: #0000ff"&gt;null</span><span style="color: #000000"&gt;){
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("解密私钥为空,<span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; BouncyCastleProvider());
        cipher.init(Cipher.DECRYPT_MODE,privateKey);
        </span><span style="color: #0000ff"&gt;byte</span>[] output=<span style="color: #000000"&gt; cipher.doFinal(cipherData);
        </span><span style="color: #0000ff"&gt;return</span><span style="color: #000000"&gt; output;
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (NoSuchAlgorithmException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("无此解密算法"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (NoSuchPaddingException E) {
        e.printStackTrace();
        </span><span style="color: #0000ff"&gt;return</span> <span style="color: #0000ff"&gt;null</span><span style="color: #000000"&gt;;
    }</span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (InvalidKeyException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("解密私钥非法,请检查"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (IllegalBlockSizeException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("密文长度非法"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (BadPaddingException E) {
        </span><span style="color: #0000ff"&gt;throw</span> <span style="color: #0000ff"&gt;new</span> Exception("密文数据已损坏"<span style="color: #000000"&gt;);
    }        
}


</span><span style="color: #008000"&gt;/**</span><span style="color: #008000"&gt;
 * 字节数据转十六进制字符串
 * </span><span style="color: #808080"&gt;@param</span><span style="color: #008000"&gt; data 输入数据
 * </span><span style="color: #808080"&gt;@return</span><span style="color: #008000"&gt; 十六进制内容
 </span><span style="color: #008000"&gt;*/</span>
<span style="color: #0000ff"&gt;public</span> <span style="color: #0000ff"&gt;static</span> String byteArrayToString(<span style="color: #0000ff"&gt;byte</span><span style="color: #000000"&gt;[] data){
    StringBuilder StringBuilder</span>= <span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; StringBuilder();
    </span><span style="color: #0000ff"&gt;for</span> (<span style="color: #0000ff"&gt;int</span> i=0; i<data.length; i++<span style="color: #000000"&gt;){
        </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt;取出字节的高四位 作为索引得到相应的十六进制标识符 注意无符号右移</span>
        StringBuilder.append(HEX_CHAR[(data[i] &amp; 0xf0)>>> 4<span style="color: #000000"&gt;]);
        </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt;取出字节的低四位 作为索引得到相应的十六进制标识符</span>
        StringBuilder.append(HEX_CHAR[(data[i] &amp; 0x0f<span style="color: #000000"&gt;)]);
        </span><span style="color: #0000ff"&gt;if</span> (i<data.length-1<span style="color: #000000"&gt;){
            StringBuilder.append(</span>' '<span style="color: #000000"&gt;);
        }
    }
    </span><span style="color: #0000ff"&gt;return</span><span style="color: #000000"&gt; StringBuilder.toString();
}


</span><span style="color: #0000ff"&gt;public</span> <span style="color: #0000ff"&gt;static</span> <span style="color: #0000ff"&gt;void</span><span style="color: #000000"&gt; main(String[] args){
    RSAEncrypt rsaEncrypt</span>= <span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; RSAEncrypt();
    </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt;加载公钥</span>
    <span style="color: #0000ff"&gt;try</span><span style="color: #000000"&gt; {
        rsaEncrypt.loadPublicKey(</span><span style="color: #0000ff"&gt;new</span> FileInputStream("rsa_public_key.pem"<span style="color: #000000"&gt;));
        System.out.println(</span>"加载公钥成功"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (Exception E) {
        System.err.println(e.getmessage());
        System.err.println(</span>"加载公钥失败"<span style="color: #000000"&gt;);
    }

    </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt;加载私钥</span>
    <span style="color: #0000ff"&gt;try</span><span style="color: #000000"&gt; {
        rsaEncrypt.loadPrivateKey(</span><span style="color: #0000ff"&gt;new</span> FileInputStream("rsa_private_key.pem"<span style="color: #000000"&gt;));
        System.out.println(</span>"加载私钥成功"<span style="color: #000000"&gt;);
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (Exception E) {
        System.err.println(e.getmessage());
        System.err.println(</span>"加载私钥失败"<span style="color: #000000"&gt;);
    }

    </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt;测试字符串</span>
    String encryptStr= "taoshihan"<span style="color: #000000"&gt;;
    System.out.println(</span>"加密前:"<span style="color: #000000"&gt;);
    System.out.println(encryptStr);
    </span><span style="color: #0000ff"&gt;try</span><span style="color: #000000"&gt; {
        </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt;加密</span>
        <span style="color: #0000ff"&gt;byte</span>[] cipher =<span style="color: #000000"&gt; rsaEncrypt.encrypt(rsaEncrypt.getPublicKey(),encryptStr.getBytes());
        </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt;解密</span>
        <span style="color: #0000ff"&gt;byte</span>[] plaintext =<span style="color: #000000"&gt; rsaEncrypt.decrypt(rsaEncrypt.getPrivateKey(),cipher);
        BASE64Encoder encode </span>= <span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; BASE64Encoder(); 
        String buffer</span>=<span style="color: #000000"&gt; encode.encode(cipher);
        System.out.println(</span>"加密后:"<span style="color: #000000"&gt;);
        System.out.println(</span><span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; String(buffer));
        System.out.println(</span>"解密后:"<span style="color: #000000"&gt;);
        System.out.println(</span><span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; String(plaintext));
    } </span><span style="color: #0000ff"&gt;catch</span><span style="color: #000000"&gt; (Exception E) {
        System.err.println(e.getmessage());
    }
}

}

带包编译和执行

执行结果:

9i= 解密后: taoshihan

sHell使用公钥加密,php使用私钥解密

sHell:

加密后的字符串

lNJ50ODiofcp+adrtAI943HOsjdDTg3UMfUkt0NI7DhUjxCM+NAlBH08WVQRtYK9W8ZoQOta3QH6
PzmJT4WsI0yfNGiUWYgoYgSOtPURSQMBACt3DM2Y5mEKqzbKLrhN+S+9Jrtmef1VuBUes8wN6rOD
UHxI+vDwQ+utRJRRo9U=

php:

php ="BACt3DM2Y5mEKqzbKLrhN+S+9Jrtmef1VuBUes8wN6rOD UHxI+vDwQ+utRJRRo9U=" ."\n"<span style="color: #008000">//<span style="color: #008000">私钥解密
<span style="color: #800080">$private_key
=<span style="color: #008080">file_get_contents
("rsa_private_key.pem"<span style="color: #000000">);
<span style="color: #800080">$pi_key = openssl_pkey_get_private(<span style="color: #800080">$private_key<span style="color: #000000">);
openssl_private_decrypt(<span style="color: #008080">base64_decode(<span style="color: #800080">$encrypted),<span style="color: #800080">$pi_key<span style="color: #000000">);
<span style="color: #0000ff">echo "解密后:\n"<span style="color: #000000">;
<span style="color: #0000ff">echo <span style="color: #800080">$decrypted."\n";

执行结果:

lNJ50ODiofcp+adrtAI943HOsjdDTg3UMfUkt0NI7DhUjxCM+BACt3DM2Y5mEKqzbKLrhN+S++vDwQ+utRJRRo9U=:

java使用公钥加密,php解密:

拿上一步java生成的加密后字符串

php ="9i=" ."\n"<span style="color: #008000">//<span style="color: #008000">私钥解密
<span style="color: #800080">$private_key
=<span style="color: #008080">file_get_contents
("rsa_private_key.pem"<span style="color: #000000">);
<span style="color: #800080">$pi_key = openssl_pkey_get_private(<span style="color: #800080">$private_key<span style="color: #000000">);
openssl_private_decrypt(<span style="color: #008080">base64_decode(<span style="color: #800080">$encrypted),<span style="color: #800080">$pi_key<span style="color: #000000">);
<span style="color: #0000ff">echo "解密后:\n"<span style="color: #000000">;
<span style="color: #0000ff">echo <span style="color: #800080">$decrypted."\n";

执行结果:

9i= 解密后: taoshihan

  

  

 

大佬总结

以上是大佬教程为你收集整理的[Linux] 使用openssl实现RSA非对称加密全部内容,希望文章能够帮你解决[Linux] 使用openssl实现RSA非对称加密所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: