问答详情
源自:3-1 RSA算法实现及应用

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

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

提问者:慕粉4284617 2016-10-25 20:19

个回答

  • 慕后端6532889
    2016-11-23 21:01:39

    老师的意思的是密钥的转换,实际上并不需要转换,也不需要重新生成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));
        }
    }

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