加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

[Linux] 使用openssl实现RSA非对称加密

发布时间:2020-12-15 07:19:24 所属栏目:安全 来源:网络整理
导读:简单定义:公钥和私钥,加密和解密使用的是两个不同的密钥,所以是非对称 系统:ubuntu 14.04 软件:openssl java php 生成公钥私钥 使用命令生成私钥: 参数:genrsa 生成密钥 ? -out 输出到文件 ?rsa_private_key.pem 文件名 ?1024 长度 从私钥中提取公钥: 参数:

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

系统: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

使用公钥加密:

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

使用私钥解密:

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

php加解密

="taoshihan" "加密前:{}n" =("rsa_public_key.pem" = openssl_pkey_get_public(,,=(); "加密后: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的文件

执行后结果:

java加解密:

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

RSAEncrypt.java 文件

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

}

带包编译和执行

执行结果:

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

shell:

加密后的字符串

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

php:

="" ."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++S++vDwQ+utRJRRo9U=:

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

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

="" ."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";

执行结果:

  

  

 

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读