为了账号安全,请及时绑定邮箱和手机立即绑定

为什么已经获取了私钥了还要用keyfactory?

为什么已经获取了私钥了还要用keyfactory?

正在回答

1 回答

老师的意思的是密钥的转换,实际上并不需要转换,也不需要重新生成keyfactory。可能是实际项目中一般会这样,因为实际接受方和发送方并不知道对方的密钥的encoded format(编码格式),所以需要转换成自己使用encoded format。例如本节里面的X509...之类的。而KeyFactory就是转换格式后重新生成私钥,公钥。

也可以用下面的代码,不需要转换,理论上是可以的:

package com.imooc.RSA;
import org.apache.commons.codec.binary.Hex;
import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
/**
 * Created by anyuan on 2016/11/23.
 */
public class ImoocRSA {
    public static final String src = "imooc security rsa";
    public static void main(String[] args) throws Exception {
        jdkRSA();
    }
    public static void jdkRSA() throws Exception {
        //初始化密钥
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(512);//512~65532
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        //私钥加密,公钥解密
        //下面是产生密钥工厂,用公钥或者私钥产生密钥工厂,进而产生密钥。原则上这里可以省略.密钥转换也可以省略
//        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
//        PrivateKey privateKey = keyFactory.generatePrivate((KeySpec) keyPair.getPrivate());
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPrivate());
        byte[] result = cipher.doFinal(src.getBytes());
        System.out.println("**私钥加密,公钥解密**");
        System.out.println("加密:" + Hex.encodeHexString(result));
        cipher.init(Cipher.DECRYPT_MODE, keyPair.getPublic());
        result = cipher.doFinal(result);
        System.out.println("解密:" + new String(result));
    }
}

代码简洁很多。自己写的时候没必要像老师那么繁琐。但是实际项目中就不一定了。


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

为什么已经获取了私钥了还要用keyfactory?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信