密码学学习七-非对称加密(java)

import com.sun.org.apache.xml.internal.security.utils.Base64;
import javafx.util.Pair;
import org.junit.Before;
import org.junit.Test;

import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
 * @author huwenlong
 * @date 2020/9/20 11:31
 */
public class Rsa {

    String type = "RSA";

    private KeyPairGenerator keyPairGenerator;

    private KeyPair keyPair;

    private Cipher cipher;

    private KeyFactory keyFactory;

    @Before
    public void init() throws Exception {
        //  创建密钥对生成器对象
        keyPairGenerator = KeyPairGenerator.getInstance(type);
        // 生成密钥对
        keyPair = keyPairGenerator.generateKeyPair();
        cipher = Cipher.getInstance(type);
        keyFactory = KeyFactory.getInstance(type);
    }

    @Test
    public void testRsa() throws Exception {
        Pair<String, String> pair = getKeys();
        // 生成公钥和私钥后通常保存在本地文件,防止每次都生成公钥私钥耗性能
        String publicKey = pair.getKey();
        String privateKey = pair.getValue();
        System.out.println("public key:" + publicKey);
        System.out.println("\nprivate key:" + privateKey);
        String code = encipher("小明", privateKey);
        System.out.println("\ncode:" + code);
        System.out.println("\nprimary text:" + decipher(code, publicKey));
    }

    public Pair<String, String> getKeys() throws Exception {
        // 生成私钥
        PrivateKey privateKey = keyPair.getPrivate();
        // 生成公钥
        PublicKey publicKey = keyPair.getPublic();
        // 获取私钥字节数组
        byte[] privateKeyEncoded = privateKey.getEncoded();
        // 获取公钥字节数组
        byte[] publicKeyEncoded = publicKey.getEncoded();
        // 对公私钥进行base64编码
        String privateKeyString = Base64.encode(privateKeyEncoded);
        String publicKeyString = Base64.encode(publicKeyEncoded);
        return new Pair<>(publicKeyString, privateKeyString);
    }

    public String encipher(String str, String key) throws Exception {
        // 创建私钥key规则
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decode(key));
        // 私钥加密
        cipher.init(Cipher.ENCRYPT_MODE, keyFactory.generatePrivate(pkcs8EncodedKeySpec));
        return Base64.encode(cipher.doFinal(str.getBytes()));
    }

    public String decipher(String str, String key) throws Exception {
        // 创建公钥key规则
        X509EncodedKeySpec pkcs8EncodedKeySpec = new X509EncodedKeySpec(Base64.decode(key));
        // 公钥解密
        cipher.init(Cipher.DECRYPT_MODE, keyFactory.generatePublic(pkcs8EncodedKeySpec));
        return new String(cipher.doFinal(Base64.decode(str)));
    }
}

输出

public key:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHnHuemLkcy2DG8CN0U6HoOXeBtwfl9cvx17Ky
wLo/5lQfIcqBmeXRw+atGcrK7wS2JRQYc0WGSugqXfQrFBRkcoUyBVyHJcp/nMRYpTmI7K9OZgeN
JDLUzZzRmz41n+HdXJ+B7mzNdsSixJsp7sm35ioj5HD4bf1MEqeWxvdb+QIDAQAB

private key:MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIece56YuRzLYMbwI3RToeg5d4G3
B+X1y/HXsrLAuj/mVB8hyoGZ5dHD5q0ZysrvBLYlFBhzRYZK6Cpd9CsUFGRyhTIFXIclyn+cxFil
OYjsr05mB40kMtTNnNGbPjWf4d1cn4HubM12xKLEmynuybfmKiPkcPht/UwSp5bG91v5AgMBAAEC
gYBKRE2DDpqaBVtrt4mDJGYP2qDzHfyqWJEnUfxgXqHhas94+TWBAnpVBZcoB28C8iE/a1D1DvPt
VsqMoUWd7fI4QDg5nl3rT93wNOrqfEdSu9ItwzM7Dx5v5SbRcDN0Y8xaMzDQMZoy/orZhIV41D5j
UCnq4eJsyB2ZQKY4hG/+rQJBAMDIM9QUT/EAQ0km1R49dgeGu1ZwE3wJ7BfmjCEfnZf8vhpmVWol
/2GN4BCaYwzGCDxZ6TcDcf9S5cmmmUYQ54MCQQC0FN557MT935yiKrs7eqwRqs5wIDUWcTLr4w+C
xbHZdK6fSnJSUPjUvhMg/32RWy+vMmrwUsP9pvzMPDRthFnTAkBtJ+7Qwr+RAkkW/nnlqX9PO6aP
ht5BeYzI662kg7ZD/MPXRuJOPD2iCyc3v3MeJHM9WNuIXtcJbvLVfxOCbMfpAkBzjMCEc4yjagxT
ch/ZtokafQMhp0jpMZF/Ep8tRjUsV1aFF3vrndFMkPotPkMQNfaO8Eb2FeV0qOWlFyx86WPJAkA2
WuO+PJkjYkg9FCFBXIlr2qS3FPVSevPaFOsdD61ALZumPK7GeLUD0WfNafAlVqfnG1gMtWNmnicZ
+Np45TZ/

code:AjMwcHL5Fj9D0W6B8jO0MBvFPLOYpukT2ioNdZTX4lOXDFP+nOKdGh+6e8OMuS0sXp1v2xkSuOqc
EfUISkN+jZarSouFHoZepJyridp/LZsQQtE8PFsAC3VNKnnEpFw4bUFNlA4KSuNHLDAbjVMlAHcQ
/qB8dvTCl8/9RxFEXMc=

primary text:小明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值