关于javapkcs1的信息

博主:adminadmin 2022-11-30 08:02:10 55

本篇文章给大家谈谈javapkcs1,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

如何实现用javascript实现rsa加解密

服务端生成公钥与私钥,保存。

客户端在请求到登录页面后,随机生成一字符串。

后此随机字符串作为密钥加密密码,再用从服务端获取到的公钥加密生成的随机字符串

将此两段密文传入服务端,服务端用私钥解出随机字符串,再用此私钥解出加密的密文。这其中有一个关键是解决服务端的公钥,传入客户端,客户端用此公钥加密字符串后,后又能在服务端用私钥解出。

步骤:

服务端的RSA  Java实现:

/** 

 *  

 */  

package com.sunsoft.struts.util;  

  

import java.io.ByteArrayOutputStream;  

import java.io.FileInputStream;  

import java.io.FileOutputStream;  

import java.io.ObjectInputStream;  

import java.io.ObjectOutputStream;  

import java.math.BigInteger;  

import java.security.KeyFactory;  

import java.security.KeyPair;  

import java.security.KeyPairGenerator;  

import java.security.NoSuchAlgorithmException;  

import java.security.PrivateKey;  

import java.security.PublicKey;  

import java.security.SecureRandom;  

import java.security.interfaces.RSAPrivateKey;  

import java.security.interfaces.RSAPublicKey;  

import java.security.spec.InvalidKeySpecException;  

import java.security.spec.RSAPrivateKeySpec;  

import java.security.spec.RSAPublicKeySpec;  

  

import javax.crypto.Cipher;  

  

  

  

/** 

 * RSA 工具类。提供加密,解密,生成密钥对等方法。 

 * 需要到

下载bcprov-jdk14-123.jar。 

 *  

 */  

public class RSAUtil {  

    /** 

     * * 生成密钥对 * 

     *  

     * @return KeyPair * 

     * @throws EncryptException 

     */  

    public static KeyPair generateKeyPair() throws Exception {  

        try {  

            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",  

                    new org.bouncycastle.jce.provider.BouncyCastleProvider());  

            final int KEY_SIZE = 1024;// 没什么好说的了,这个值关系到块加密的大小,可以更改,但是不要太大,否则效率会低  

            keyPairGen.initialize(KEY_SIZE, new SecureRandom());  

            KeyPair keyPair = keyPairGen.generateKeyPair();  

            saveKeyPair(keyPair);  

            return keyPair;  

        } catch (Exception e) {  

            throw new Exception(e.getMessage());  

        }  

    }  

      

    public static KeyPair getKeyPair()throws Exception{  

        FileInputStream fis = new FileInputStream("C:/RSAKey.txt");  

         ObjectInputStream oos = new ObjectInputStream(fis);  

         KeyPair kp= (KeyPair) oos.readObject();  

         oos.close();  

         fis.close();  

         return kp;  

    }  

      

    public static void saveKeyPair(KeyPair kp)throws Exception{  

          

         FileOutputStream fos = new FileOutputStream("C:/RSAKey.txt");  

         ObjectOutputStream oos = new ObjectOutputStream(fos);  

         //生成密钥  

         oos.writeObject(kp);  

         oos.close();  

         fos.close();  

    }  

  

    /** 

     * * 生成公钥 * 

     *  

     * @param modulus * 

     * @param publicExponent * 

     * @return RSAPublicKey * 

     * @throws Exception 

     */  

    public static RSAPublicKey generateRSAPublicKey(byte[] modulus,  

            byte[] publicExponent) throws Exception {  

        KeyFactory keyFac = null;  

        try {  

            keyFac = KeyFactory.getInstance("RSA",  

                    new org.bouncycastle.jce.provider.BouncyCastleProvider());  

        } catch (NoSuchAlgorithmException ex) {  

            throw new Exception(ex.getMessage());  

        }  

  

        RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(  

                modulus), new BigInteger(publicExponent));  

        try {  

            return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);  

        } catch (InvalidKeySpecException ex) {  

            throw new Exception(ex.getMessage());  

        }  

    }  

  

    /** 

     * * 生成私钥 * 

     *  

     * @param modulus * 

     * @param privateExponent * 

     * @return RSAPrivateKey * 

     * @throws Exception 

     */  

    public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus,  

            byte[] privateExponent) throws Exception {  

        KeyFactory keyFac = null;  

        try {  

            keyFac = KeyFactory.getInstance("RSA",  

                    new org.bouncycastle.jce.provider.BouncyCastleProvider());  

        } catch (NoSuchAlgorithmException ex) {  

            throw new Exception(ex.getMessage());  

        }  

  

        RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(  

                modulus), new BigInteger(privateExponent));  

        try {  

            return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);  

        } catch (InvalidKeySpecException ex) {  

            throw new Exception(ex.getMessage());  

        }  

    }  

  

    /** 

     * * 加密 * 

     *  

     * @param key 

     *            加密的密钥 * 

     * @param data 

     *            待加密的明文数据 * 

     * @return 加密后的数据 * 

     * @throws Exception 

     */  

    public static byte[] encrypt(PublicKey pk, byte[] data) throws Exception {  

        try {  

            Cipher cipher = Cipher.getInstance("RSA",  

                    new org.bouncycastle.jce.provider.BouncyCastleProvider());  

            cipher.init(Cipher.ENCRYPT_MODE, pk);  

            int blockSize = cipher.getBlockSize();// 获得加密块大小,如:加密前数据为128个byte,而key_size=1024  

            // 加密块大小为127  

            // byte,加密后为128个byte;因此共有2个加密块,第一个127  

            // byte第二个为1个byte  

            int outputSize = cipher.getOutputSize(data.length);// 获得加密块加密后块大小  

            int leavedSize = data.length % blockSize;  

            int blocksSize = leavedSize != 0 ? data.length / blockSize + 1  

                    : data.length / blockSize;  

            byte[] raw = new byte[outputSize * blocksSize];  

            int i = 0;  

            while (data.length - i * blockSize  0) {  

                if (data.length - i * blockSize  blockSize)  

                    cipher.doFinal(data, i * blockSize, blockSize, raw, i  

                            * outputSize);  

                else  

                    cipher.doFinal(data, i * blockSize, data.length - i  

                            * blockSize, raw, i * outputSize);  

                // 这里面doUpdate方法不可用,查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到  

                // ByteArrayOutputStream中,而最后doFinal的时候才将所有的byte[]进行加密,可是到了此时加密块大小很可能已经超出了  

                // OutputSize所以只好用dofinal方法。  

  

                i++;  

            }  

            return raw;  

        } catch (Exception e) {  

            throw new Exception(e.getMessage());  

        }  

    }  

  

    /** 

     * * 解密 * 

     *  

     * @param key 

     *            解密的密钥 * 

     * @param raw 

     *            已经加密的数据 * 

     * @return 解密后的明文 * 

     * @throws Exception 

     */  

    public static byte[] decrypt(PrivateKey pk, byte[] raw) throws Exception {  

        try {  

            Cipher cipher = Cipher.getInstance("RSA",  

                    new org.bouncycastle.jce.provider.BouncyCastleProvider());  

            cipher.init(cipher.DECRYPT_MODE, pk);  

            int blockSize = cipher.getBlockSize();  

            ByteArrayOutputStream bout = new ByteArrayOutputStream(64);  

            int j = 0;  

  

            while (raw.length - j * blockSize  0) {  

                bout.write(cipher.doFinal(raw, j * blockSize, blockSize));  

                j++;  

            }  

            return bout.toByteArray();  

        } catch (Exception e) {  

            throw new Exception(e.getMessage());  

        }  

    }  

  

    /** 

     * * * 

     *  

     * @param args * 

     * @throws Exception 

     */  

    public static void main(String[] args) throws Exception {  

        RSAPublicKey rsap = (RSAPublicKey) RSAUtil.generateKeyPair().getPublic();  

        String test = "hello world";  

        byte[] en_test = encrypt(getKeyPair().getPublic(),test.getBytes());  

        byte[] de_test = decrypt(getKeyPair().getPrivate(),en_test);  

        System.out.println(new String(de_test));  

    }  

}

测试页面IndexAction.java:

/* 

 * Generated by MyEclipse Struts 

 * Template path: templates/java/JavaClass.vtl 

 */  

package com.sunsoft.struts.action;  

  

import java.security.interfaces.RSAPrivateKey;  

import java.security.interfaces.RSAPublicKey;  

  

import javax.servlet.http.HttpServletRequest;  

import javax.servlet.http.HttpServletResponse;  

  

import org.apache.struts.action.Action;  

import org.apache.struts.action.ActionForm;  

import org.apache.struts.action.ActionForward;  

import org.apache.struts.action.ActionMapping;  

  

import com.sunsoft.struts.util.RSAUtil;  

  

/**  

 * MyEclipse Struts 

 * Creation date: 06-28-2008 

 *  

 * XDoclet definition: 

 * @struts.action validate="true" 

 */  

public class IndexAction extends Action {  

    /* 

     * Generated Methods 

     */  

  

    /**  

     * Method execute 

     * @param mapping 

     * @param form 

     * @param request 

     * @param response 

     * @return ActionForward 

     */  

    public ActionForward execute(ActionMapping mapping, ActionForm form,  

            HttpServletRequest request, HttpServletResponse response)throws Exception {  

          

        RSAPublicKey rsap = (RSAPublicKey) RSAUtil.getKeyPair().getPublic();  

        String module = rsap.getModulus().toString(16);  

        String empoent = rsap.getPublicExponent().toString(16);  

        System.out.println("module");  

        System.out.println(module);  

        System.out.println("empoent");  

        System.out.println(empoent);  

        request.setAttribute("m", module);  

        request.setAttribute("e", empoent);  

        return mapping.findForward("login");  

    }  

}

通过此action进入登录页面,并传入公钥的 Modulus 与PublicExponent的hex编码形式。

pkcs1与pkcs8格式RSA私钥互相转换

1、PKCS1私钥生成

private.pem 的内容如下:

2、PKCS1私钥转换为PKCS8(该格式一般Java调用)

pkcs8.pem文件内容

3、PKCS8格式私钥转换为PKCS1(传统私钥格式)

pkcs1.pem文件内容如下:

如何使用javascript进行RSA/ECB/PKCS1Padding算法加密

javascript rsa加密/java使用Cipher.getInstance("RSA/ECB/PKCS1Padding")解密

1)服务器端获得生成密钥对;

2)javascript使用公钥加密;

3)java获得密文使用私钥解密;

RSA PKCS#1在java中怎么实现?

楼主看看下面的代码是不是你所需要的,这是我原来用的时候收集的

import javax.crypto.Cipher;

import java.security.*;

import java.security.spec.RSAPublicKeySpec;

import java.security.spec.RSAPrivateKeySpec;

import java.security.spec.InvalidKeySpecException;

import java.security.interfaces.RSAPrivateKey;

import java.security.interfaces.RSAPublicKey;

import java.io.*;

import java.math.BigInteger;

/**

* RSA 工具类。提供加密,解密,生成密钥对等方法。

* 需要到下载bcprov-jdk14-123.jar。

* RSA加密原理概述

* RSA的安全性依赖于大数的分解,公钥和私钥都是两个大素数(大于100的十进制位)的函数。

* 据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积

* ===================================================================

* (该算法的安全性未得到理论的证明)

* ===================================================================

* 密钥的产生:

* 1.选择两个大素数 p,q ,计算 n=p*q;

* 2.随机选择加密密钥 e ,要求 e 和 (p-1)*(q-1)互质

* 3.利用 Euclid 算法计算解密密钥 d , 使其满足 e*d = 1(mod(p-1)*(q-1)) (其中 n,d 也要互质)

* 4:至此得出公钥为 (n,e) 私钥为 (n,d)

* ===================================================================

* 加解密方法:

* 1.首先将要加密的信息 m(二进制表示) 分成等长的数据块 m1,m2,...,mi 块长 s(尽可能大) ,其中 2^sn

* 2:对应的密文是: ci = mi^e(mod n)

* 3:解密时作如下计算: mi = ci^d(mod n)

* ===================================================================

* RSA速度

* 由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论是软件还是硬件实现。

* 速度一直是RSA的缺陷。一般来说只用于少量数据加密。

* 文件名:RSAUtil.javabr

* @author 赵峰br

* 版本:1.0.1br

* 描述:本算法摘自网络,是对RSA算法的实现br

* 创建时间:2009-7-10 下午09:58:16br

* 文件描述:首先生成两个大素数,然后根据Euclid算法生成解密密钥br

*/

public class RSAUtil {

//密钥对

private KeyPair keyPair = null;

/**

* 初始化密钥对

*/

public RSAUtil(){

try {

this.keyPair = this.generateKeyPair();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 生成密钥对

* @return KeyPair

* @throws Exception

*/

private KeyPair generateKeyPair() throws Exception {

try {

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider());

//这个值关系到块加密的大小,可以更改,但是不要太大,否则效率会低

final int KEY_SIZE = 1024;

keyPairGen.initialize(KEY_SIZE, new SecureRandom());

KeyPair keyPair = keyPairGen.genKeyPair();

return keyPair;

} catch (Exception e) {

throw new Exception(e.getMessage());

}

}

/**

* 生成公钥

* @param modulus

* @param publicExponent

* @return RSAPublicKey

* @throws Exception

*/

private RSAPublicKey generateRSAPublicKey(byte[] modulus, byte[] publicExponent) throws Exception {

KeyFactory keyFac = null;

try {

keyFac = KeyFactory.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

} catch (NoSuchAlgorithmException ex) {

throw new Exception(ex.getMessage());

}

RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modulus), new BigInteger(publicExponent));

try {

return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);

} catch (InvalidKeySpecException ex) {

throw new Exception(ex.getMessage());

}

}

/**

* 生成私钥

* @param modulus

* @param privateExponent

* @return RSAPrivateKey

* @throws Exception

*/

private RSAPrivateKey generateRSAPrivateKey(byte[] modulus, byte[] privateExponent) throws Exception {

KeyFactory keyFac = null;

try {

keyFac = KeyFactory.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

} catch (NoSuchAlgorithmException ex) {

throw new Exception(ex.getMessage());

}

RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(modulus), new BigInteger(privateExponent));

try {

return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);

} catch (InvalidKeySpecException ex) {

throw new Exception(ex.getMessage());

}

}

/**

* 加密

* @param key 加密的密钥

* @param data 待加密的明文数据

* @return 加密后的数据

* @throws Exception

*/

public byte[] encrypt(Key key, byte[] data) throws Exception {

try {

Cipher cipher = Cipher.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

cipher.init(Cipher.ENCRYPT_MODE, key);

// 获得加密块大小,如:加密前数据为128个byte,而key_size=1024 加密块大小为127 byte,加密后为128个byte;

// 因此共有2个加密块,第一个127 byte第二个为1个byte

int blockSize = cipher.getBlockSize();

// System.out.println("blockSize:"+blockSize);

int outputSize = cipher.getOutputSize(data.length);// 获得加密块加密后块大小

// System.out.println("加密块大小:"+outputSize);

int leavedSize = data.length % blockSize;

// System.out.println("leavedSize:"+leavedSize);

int blocksSize = leavedSize != 0 ? data.length / blockSize + 1 : data.length / blockSize;

byte[] raw = new byte[outputSize * blocksSize];

int i = 0;

while (data.length - i * blockSize 0) {

if (data.length - i * blockSize blockSize)

cipher.doFinal(data, i * blockSize, blockSize, raw, i * outputSize);

else

cipher.doFinal(data, i * blockSize, data.length - i * blockSize, raw, i * outputSize);

// 这里面doUpdate方法不可用,查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到ByteArrayOutputStream中

// 而最后doFinal的时候才将所有的byte[]进行加密,可是到了此时加密块大小很可能已经超出了OutputSize所以只好用dofinal方法。

i++;

}

return raw;

} catch (Exception e) {

throw new Exception(e.getMessage());

}

}

/**

* 解密

* @param key 解密的密钥

* @param raw 已经加密的数据

* @return 解密后的明文

* @throws Exception

*/

@SuppressWarnings("static-access")

public byte[] decrypt(Key key, byte[] raw) throws Exception {

try {

Cipher cipher = Cipher.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

cipher.init(cipher.DECRYPT_MODE, key);

int blockSize = cipher.getBlockSize();

ByteArrayOutputStream bout = new ByteArrayOutputStream(64);

int j = 0;

while (raw.length - j * blockSize 0) {

bout.write(cipher.doFinal(raw, j * blockSize, blockSize));

j++;

}

return bout.toByteArray();

} catch (Exception e) {

throw new Exception(e.getMessage());

}

}

/**

* 返回公钥

* @return

* @throws Exception

*/

public RSAPublicKey getRSAPublicKey() throws Exception{

//获取公钥

RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();

//获取公钥系数(字节数组形式)

byte[] pubModBytes = pubKey.getModulus().toByteArray();

//返回公钥公用指数(字节数组形式)

byte[] pubPubExpBytes = pubKey.getPublicExponent().toByteArray();

//生成公钥

RSAPublicKey recoveryPubKey = this.generateRSAPublicKey(pubModBytes,pubPubExpBytes);

return recoveryPubKey;

}

/**

* 获取私钥

* @return

* @throws Exception

*/

public RSAPrivateKey getRSAPrivateKey() throws Exception{

// 获取私钥

RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();

// 返回私钥系数(字节数组形式)

byte[] priModBytes = priKey.getModulus().toByteArray();

// 返回私钥专用指数(字节数组形式)

byte[] priPriExpBytes = priKey.getPrivateExponent().toByteArray();

// 生成私钥

RSAPrivateKey recoveryPriKey = this.generateRSAPrivateKey(priModBytes,priPriExpBytes);

return recoveryPriKey;

}

/**

* 测试

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

RSAUtil rsa = new RSAUtil();

String str = "天龙八部、神雕侠侣、射雕英雄传白马啸西风";

RSAPublicKey pubKey = rsa.getRSAPublicKey();

RSAPrivateKey priKey = rsa.getRSAPrivateKey();

// System.out.println("加密后==" + new String(rsa.encrypt(pubKey,str.getBytes())));

String mw = new String(rsa.encrypt(pubKey, str.getBytes()));

System.out.println("加密后:"+mw);

// System.out.println("解密后:");

System.out.println("解密后==" + new String(rsa.decrypt(priKey,rsa.encrypt(pubKey,str.getBytes()))));

}

}

Android中自带的RSA加密算法和JAVA中的不是一个标准的吗

有点区别,java中默认填充方式是RSA/ECB/PKCS1Padding,Cipher.getInstance("RSA/ECB/PKCS1Padding");android不是

java

Cipher cipher =

Cipher.getInstance("RSA/ECB/PKCS1Padding");

android

Cipher cipher =

Cipher.getInstance("RSA/ECB/NoPadding");

pkcs1padding怎么填充

本文主要谈一下密码学中的加密和数字签名,以及其在java中如何进行使用。对密码学有兴趣的伙伴,推荐看BruceSchneier的著作:AppliedCrypotography。在jdk1.5的发行版本中安全性方面有了很大的改进,也提供了对RSA算法的直接支持,现在我们从实例入手解决问题(本文仅是作为简单介绍):一、密码学上常用的概念 1)消息摘要:这是一种与消息认证码结合使用以确保消息完整性的技术。主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4、MD5、SHA-1,jdk1.5对上面都提供了支持,在java中进行消息摘要很简单,java.security.MessageDigest提供了一个简易的操作方法:/***MessageDigestExample.java*Copyright2005-2-16*/importjava.security.MessageDigest;/***单一的消息摘要算法,不使用密码.可以用来对明文消息(如:密码)隐藏保存*/publicclassMessageDigestExample{publicstaticvoidmain(String[]args)throwsException{if(args.length!=1){ System.err.println("Usage:javaMessageDigestExampletext"); System.exit(1);}byte[]plainText=args[0].getBytes("UTF8");//使用getInstance("算法")来获得消息摘要,这里使用SHA-1的160位算法MessageDigestmessageDigest=MessageDigest.getInstance("SHA-1");System.out.println(""+messageDigest.getProvider().getInfo());//开始使用算法messageDigest.update(plainText);System.out.println("Digest:");//输出算法运算结果System.out.println(newString(messageDigest.digest(),"UTF8"));}}还可以通过消息认证码来进行加密实现,javax.crypto.Mac提供了一个解决方案,有兴趣者可以参考相关API文档,本文只是简单介绍什么是摘要算法。2)私钥加密:消息摘要只能检查消息的完整性,但是单向的,对明文消息并不能加密,要加密明文的消息的话,就要使用其他的算法,要确保机密性,我们需要使用私钥密码术来交换私有消息。这种最好理解,使用对称算法。比如:A用一个密钥对一个文件加密,而B读取这个文件的话,则需要和A一样的密钥,双方共享一个私钥(而在web环境下,私钥在传递时容易被侦听):使用私钥加密的话,首先需要一个密钥,可用javax.crypto.KeyGenerator产生一个密钥(java.security.Key),然后传递给一个加密工具(javax.crypto.Cipher),该工具再使用相应的算法来进行加密,主要对称算法有:DES(实际密钥只用到56位),AES(支持三种密钥长度:128、192、256位),通常首先128位,其他的还有DESede等,jdk1.5种也提供了对对称算法的支持,以下例子使用AES算法来加密:/***PrivateExmaple.java*Copyright2005-2-16*/importjavax.crypto.Cipher;importjavax.crypto.KeyGenerator;importjava.security.Key;/***私鈅加密,保证消息机密性*/publicclassPrivateExample{publicstaticvoidmain(String[]args)throwsException{if(args.length!=1){ System.err.println("Usage:javaPrivateExample"); System.exit(1);}byte[]plainText=args[0].getBytes("UTF8");//通过KeyGenerator形成一个keySystem.out.println("StartgenerateAESkey");KeyGeneratorkeyGen=KeyGenerator.getInstance("AES");keyGen.init(128);Keykey=keyGen.generateKey();System.out.println("FinishgeneratingDESkey");//获得一个私鈅加密类Cipher,ECB是加密方式,PKCS5Padding是填充方法Ciphercipher=Cipher.getInstance("AES/ECB/PKCS5Padding");System.out.println(""+cipher.getProvider().getInfo());//使用私鈅加密System.out.println("Startencryption:");cipher.init(Cipher.ENCRYPT_MODE,key);byte[]cipherText=cipher.doFinal(plainText);System.out.println("Finishencryption:");System.out.println(newString(cipherText,"UTF8"));System.out.println("Startdecryption:");cipher.init(Cipher.DECRYPT_MODE,key);byte[]newPlainText=cipher.doFinal(cipherText);System.out.println("Finishdecryption:");System.out.println(newString(newPlainText,"UTF8"));}}3)公钥加密:上面提到,私钥加密需要一个共享的密钥,那么如何传递密钥呢?web环境下,直接传递的话很容易被侦听到,幸好有了公钥加密的出现。公钥加密也叫不对称加密,不对称算法使用一对密钥对,一个公钥,一个私钥,使用公钥加密的数据,只有私钥能解开(可用于加密);同时,使用私钥加密的数据,只有公钥能解开(签名)。但是速度很慢(比私钥加密慢100到1000倍),公钥的主要算法有RSA,还包括Blowfish,Diffie-Helman等,jdk1.5种提供了对RSA的支持,是一个改进的地方:/***PublicExample.java*Copyright2005-2-16*/importjava.security.Key;importjavax.crypto.Cipher;importjava.security.KeyPairGenerator;importjava.security.KeyPair;/***一个简单的公鈅加密例子,Cipher类使用KeyPairGenerator生成的公鈅和私鈅*/publicclassPublicExample{publicstaticvoidmain(String[]args)throwsException{if(args.length!=1){ System.err.println("Usage:javaPublicExample"); System.exit(1);}byte[]plainText=args[0].getBytes("UTF8");//构成一个RSA密钥System.out.println("StartgeneratingRSAkey");KeyPairGeneratorkeyGen=KeyPairGenerator.getInstance("RSA");keyGen.initialize(1024);KeyPairkey=keyGen.generateKeyPair();System.out.println("FinishgeneratingRSAkey");//获得一个RSA的Cipher类,使用公鈅加密Ciphercipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");System.out.println(""+cipher.getProvider().getInfo());System.out.println("Startencryption");cipher.init(Cipher.ENCRYPT_MODE,key.getPublic());byte[]cipherText=cipher.doFinal(plainText);System.out.println("Finishencryption:");System.out.println(newString(cipherText,"UTF8"));//使用私鈅解密System.out.println("Startdecryption");cipher.init(Cipher.DECRYPT_MODE,key.getPrivate());byte[]newPlainText=cipher.doFinal(cipherText);System.out.println("Finishdecryption:");System.out.println(newString(newPlainText,"UTF8"));}}4)数字签名:数字签名,它是确定交换消息的通信方身份的第一个级别。上面A通过使用公钥加密数据后发给B,B利用私钥解密就得到了需要的数据,问题来了,由于都是使用公钥加密,那么如何检验是A发过来的消息呢?上面也提到了一点,私钥是唯一的,那么A就可以利用A自己的私钥进行加密,然后B再利用A的公钥来解密,就可以了;数字签名的原理就基于此,而通常为了证明发送数据的真实性,通过利用消息摘要获得简短的消息内容,然后再利用私钥进行加密散列数据和消息一起发送。java中为数字签名提供了良好的支持,java.security.Signature类提供了消息签名:/***DigitalSignature2Example.java*Copyright2005-2-16*/importjava.security.Signature;importjava.security.KeyPairGenerator;importjava.security.KeyPair;importjava.security.SignatureException;/***数字签名,使用RSA私钥对对消息摘要签名,然后使用公鈅验证测试*/publicclassDigitalSignature2Example{publicstaticvoidmain(String[]args)throwsException{if(args.length!=1){ System.err.println("Usage:javaDigitalSignature2Example"); System.exit(1);}byte[]plainText=args[0].getBytes("UTF8");//形成RSA公钥对System.out.println("StartgeneratingRSAkey");KeyPairGeneratorkeyGen=KeyPairGenerator.getInstance("RSA");keyGen.initialize(1024);KeyPairkey=keyGen.generateKeyPair();System.out.println("FinishgeneratingRSAkey");//使用私鈅签名Signaturesig=Signature.getInstance("SHA1WithRSA");sig.initSign(key.getPrivate());sig.update(plainText);byte[]signature=sig.sign();System.out.println(sig.getProvider().getInfo());System.out.println("Signature:");System.out.println(newString(signature,"UTF8"));//使用公鈅验证System.out.println("Startsignatureverification");sig.initVerify(key.getPublic());sig.update(plainText);try{ if(sig.verify(signature)){System.out.println("Signatureverified"); }elseSystem.out.println("Signaturefailed"); }catch(SignatureExceptione){System.out.println("Signaturefailed"); }}}5)数字证书。还有个问题,就是公钥问题,A用私钥加密了,那么B接受到消息后,用A提供的公钥解密;那么现在有个讨厌的C,他把消息拦截了,然后用自己的私钥加密,同时把自己的公钥发给B,并告诉B,那是A的公钥,结果.,这时候就需要一个中间机构出来说话了(相信权威,我是正确的),就出现了CertificateAuthority(也即CA),有名的CA机构有Verisign等,目前数字认证的工业标准是:CCITT的X.509:数字证书:它将一个身份标识连同公钥一起进行封装,并由称为认证中心或CA的第三方进行数字签名。密钥库:java平台为你提供了密钥库,用作密钥和证书的资源库。从物理上讲,密钥库是缺省名称为.keystore的文件(有一个选项使它成为加密文件)。密钥和证书可以拥有名称(称为别名),每个别名都由唯一的密码保护。密钥库本身也受密码保护;您可以选择让每个别名密码与主密钥库密码匹配。使用工具keytool,我们来做一件自我认证的事情吧(相信我的认证):1、创建密钥库keytool-genkey-v-aliasfeiUserKey-keyalgRSA默认在自己的home目录下(windows系统是c:documentsandsettings目录下的.keystore文件),创建我们用RSA算法生成别名为feiUserKey的自签名的证书,如果使用了-keystoremm就在当前目录下创建一个密钥库mm文件来保存密钥和证书。2、查看证书:keytool-list列举了密钥库的所有的证书也可以在dos下输入keytool-help查看帮助。4)数字签名:数字签名,它是确定交换消息的通信方身份的第一个级别。上面A通过使用公钥加密数据后发给B,B利用私钥解密就得到了需要的数据,问题来了,由于都是使用公钥加密,那么如何检验是A发过来的消息呢?上面也提到了一点,私钥是唯一的,那么A就可以利用A自己的私钥进行加密,然后B再利用A的公钥来解密,就可以了;数字签名的原理就基于此,而通常为了证明发送数据的真实性,通过利用消息摘要获得简短的消息内容,然后再利用私钥进行加密散列数据和消息一起发送。java中为数字签名提供了良好的支持,java.security.Signature类提供了消息签名:/***DigitalSignature2Example.java*Copyright2005-2-16*/importjava.security.Signature;importjava.security.KeyPairGenerator;importjava.security.KeyPair;importjava.security.SignatureException;/***数字签名,使用RSA私钥对对消息摘要签名,然后使用公鈅验证测试*/publicclassDigitalSignature2Example{publicstaticvoidmain(String[]args)throwsException{if(args.length!=1){ System.err.println("Usage:javaDigitalSignature2Example"); System.exit(1);}byte[]plainText=args[0].getBytes("UTF8");//形成RSA公钥对System.out.println("StartgeneratingRSAkey");KeyPairGeneratorkeyGen=KeyPairGenerator.getInstance("RSA");keyGen.initialize(1024);KeyPairkey=keyGen.generateKeyPair();System.out.println("FinishgeneratingRSAkey");//使用私鈅签名Signaturesig=Signature.getInstance("SHA1WithRSA");sig.initSign(key.getPrivate());sig.update(plainText);byte[]signature=sig.sign();System.out.println(sig.getProvider().getInfo());System.out.println("Signature:");System.out.println(newString(signature,"UTF8"));//使用公鈅验证System.out.println("Startsignatureverification");sig.initVerify(key.getPublic());sig.update(plainText);try{ if(sig.verify(signature)){System.out.println("Signatureverified"); }elseSystem.out.println("Signaturefailed"); }catch(SignatureExceptione){System.out.println("Signaturefailed"); }}}5)数字证书。还有个问题,就是公钥问题,A用私钥加密了,那么B接受到消息后,用A提供的公钥解密;那么现在有个讨厌的C,他把消息拦截了,然后用自己的私钥加密,同时把自己的公钥发给B,并告诉B,那是A的公钥,结果.,这时候就需要一个中间机构出来说话了(相信权威,我是正确的),就出现了CertificateAuthority(也即CA),有名的CA机构有Verisign等,目前数字认证的工业标准是:CCITT的X.509:数字证书:它将一个身份标识连同公钥一起进行封装,并由称为认证中心或CA的第三方进行数字签名。密钥库:java平台为你提供了密钥库,用作密钥和证书的资源库。从物理上讲,密钥库是缺省名称为.keystore的文件(有一个选项使它成为加密文件)。密钥和证书可以拥有名称(称为别名),每个别名都由唯一的密码保护。密钥库本身也受密码保护;您可以选择让每个别名密码与主密钥库密码匹配。使用工具keytool,我们来做一件自我认证的事情吧(相信我的认证):1、创建密钥库keytool-genkey-v-aliasfeiUserKey-keyalgRSA默认在自己的home目录下(windows系统是c:documentsandsettings目录下的.keystore文件),创建我们用RSA算法生成别名为feiUserKey的自签名的证书,如果使用了-keystoremm就在当前目录下创建一个密钥库mm文件来保存密钥和证书。2、查看证书:keytool-list列举了密钥库的所有的证书也可以在dos下输入keytool-help查看帮助。

javapkcs1的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、javapkcs1的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-30,除非注明,否则均为首码项目网原创文章,转载请注明出处。