关于javapkcs1的信息
本篇文章给大家谈谈javapkcs1,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、如何实现用javascript实现rsa加解密
- 2、pkcs1与pkcs8格式RSA私钥互相转换
- 3、如何使用javascript进行RSA/ECB/PKCS1Padding算法加密
- 4、RSA PKCS#1在java中怎么实现?
- 5、Android中自带的RSA加密算法和JAVA中的不是一个标准的吗
- 6、pkcs1padding怎么填充
如何实现用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的信息别忘了在本站进行查找喔。
发布于:2022-11-30,除非注明,否则均为
原创文章,转载请注明出处。