常见的加密算法
基本的单向加密算法:
base64严格地说,属于编码格式,而非加密算法
MD5(MessageDigestalgorithm5,信息摘要算法)
SHA(SecureHashAlgorithm,安全散列算法)
HMAC(HashMessageAuthenticationCode,散列消息鉴别码)
复杂的对称加密(DES、PBE)、非对称加密算法:
DES(DataEncryptionStandard,数据加密算法)
PBE(Password-basedencryption,基于密码验证)
RSA(算法的名字以发明者的名字命名:RonRivest,AdiShamir和LeonardAdleman)
DH(Diffie-Hellman算法,密钥一致协议)
DSA(DigitalSignatureAlgorithm,数字签名)
ECC(EllipticCurvesCryptography,椭圆曲线密码编码学)
数字签名
算法简述
数字签名算法可以看做是一种带有密钥的消息摘要算法,并且这种密钥包含了公钥和私钥。也就是说,数字签名算法是非对称加密算法和消息摘要算法的结合体。
特点
数字签名算法要求能够验证数据完整性、认证数据来源,并起到抗否认的作用。
原理
数字签名算法包含签名和验证两项操作,遵循私钥签名,公钥验证的方式。
签名时要使用私钥和待签名数据,验证时则需要公钥、签名值和待签名数据,其核心算法主要是消息摘要算法。
1. 消息摘要
String beforeDegist = "asdf";
System.out.println("摘要前:"+beforeDegist);
//初始信息要转换成字节流的形式
byte[] plainText = beforeDegist.getBytes("UTF8");
//使用getInstance("算法")来获得消息摘要,这里使用SHA-1的160位算法或者MD5算法
geDigest messageDigest = MessageDigest.getInstance("SHA-1");
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
System.out.println("/n" + messageDigest.getProvider().getInfo());
//开始使用算法
messageDigest.update(plainText);
//输出算法运算结果
String afterDegist = new String(messageDigest.digest(),"UTF8");
System.out.println("摘要后:"+afterDegist);
2. 私钥加密
String before = "asdf";
byte[] plainText = before.getBytes("UTF8");
// STEP 1.
System.out.println("Start generate AES key.");
//得到一个使用AES算法的KeyGenerator的实例
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
//定义密钥长度128位
keyGen.init(128);
//通过KeyGenerator产生一个key(密钥算法刚才已定义,为AES)
Key key = keyGen.generateKey();
System.out.println("Finish generating AES key="+key);
//STEP 2.
//获得一个私钥加密类Cipher,定义Cipher的基本信息:ECB是加密方式,PKCS5Padding是填充方法
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
//System.out.println("/n" + cipher.getProvider().getInfo());
//STEP 3.
// 使用私钥加密
System.out.println("/n用私钥加密...");
// 把刚才生成的key当作参数,初始化使用刚才获得的私钥加密类,Cipher.ENCRYPT_MODE意思是加密
cipher.init(Cipher.ENCRYPT_MODE, key);
//私钥加密类Cipher进行加密,加密后返回一个字节流byte[]
byte[] cipherText = cipher.doFinal(plainText);
//以UTF8格式把字节流转化为String
String after1 = new String(cipherText, "UTF8");
System.out.println("用私钥加密完成:"+after1);
// STEP 4.
[java] view plain copy
//使用私钥对刚才加密的信息进行解密,看看是否一致,Cipher.DECRYPT_MODE意思是解密钥
System.out.println("/n用私钥解密...");
cipher.init(Cipher.DECRYPT_MODE, key);
//对刚才私钥加密的字节流进行解密,解密后返回一个字节流byte[]
byte[] newPlainText = cipher.doFinal(cipherText);
String after2 = new String(newPlainText, "UTF8");
System.out.println("用私钥解密完成:"+after2);
3. 公钥加密
String before = "asdf";
byte[] plainText = before.getBytes("UTF8");
//产生一个RSA密钥生成器KeyPairGenerator(顾名思义:一对钥匙生成器)
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
//定义密钥长度1024位
keyGen.initialize(1024);
//通过KeyPairGenerator产生密钥,注意:这里的key是一对钥匙!!
KeyPair key = keyGen.generateKeyPair();
//获得一个RSA的Cipher类,使用公钥加密
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
//System.out.println("/n" + cipher.getProvider().getInfo());
System.out.println("/n用公钥加密...");
//Cipher.ENCRYPT_MODE意思是加密,从一对钥匙中得到公钥 key.getPublic()
cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());
//用公钥进行加密,返回一个字节流
byte[] cipherText = cipher.doFinal(plainText);
//以UTF8格式把字节流转化为String
String after1 = new String(cipherText, "UTF8");
System.out.println("用公钥加密完成:"+after1);
//使用私钥解密
System.out.println("/n用私钥解密...");
//Cipher.DECRYPT_MODE意思是解密模式,从一对钥匙中得到私钥 key.getPrivate()
cipher.init(Cipher.DECRYPT_MODE, key.getPrivate());
//用私钥进行解密,返回一个字节流
byte[] newPlainText = cipher.doFinal(cipherText);
String after2 = new String(newPlainText, "UTF8");
System.out.println("用私钥解密完成:"+after2);
4. 数字签名
String before = "asdf";
byte[] plainText = before.getBytes("UTF8");
//形成RSA公钥对
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPair key = keyGen.generateKeyPair();
//使用私钥签名**********************************************************
Signature sig = Signature.getInstance("SHA1WithRSA");
sig.initSign(key.getPrivate());
//sig对象得到私钥
//签名对象得到原始数据
sig.update(plainText);
//sig对象得到原始数据(现实中用的是原始数据的摘要,摘要的是单向的,即摘要算法后无法解密)
byte[] signature = sig.sign();
//sig对象用私钥对原始数据进行签名,签名后得到签名signature
em.out.println(sig.getProvider().getInfo());
String after1 = new String(signature, "UTF8");
System.out.println("/n用私钥签名后:"+after1);
//使用公钥验证
sig.initVerify(key.getPublic());
//sig对象得到公钥
//签名对象得到原始信息
sig.update(plainText);
//sig对象得到原始数据(现实中是摘要)
try {
if (sig.verify(signature)) {
//sig对象用公钥解密签名signature得到原始数据(即摘要),一致则true
System.out.println("签名验证正确!!"+new String(plainText, "UTF8"));
} else {
System.out.println("签名验证失败!!");
}
}
catch (SignatureException e) {
System.out.println("签名验证失败!!");
}
5. 数字证书
try {
//前提:将证书库中的一条证书导出到证书文件(我写的例子里证书文件叫TC.cer)
//从证书文件TC.cer里读取证书信息
CertificateFactory cf = CertificateFactory.getInstance("X.509");
FileInputStream in = new FileInputStream("C:/TC.cer");
//将文件以文件流的形式读入证书类Certificate中
Certificate c = cf.generateCertificate(in);
System.err.println("转换成String后的证书信息:"+c.toString());
*/
//或者不用上面代码的方法,直接从证书库中读取证书信息,和上面的结果一摸一样
String pass="qazzaq";
FileInputStream in2=new FileInputStream("C:/BocsoftKeyLib");
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(in2,pass.toCharArray());
String alias = "TestCertification";
//alias为条目的别名
Certificate c=ks.getCertificate(alias);
System.err.println("转换成String后的证书信息:"+c.toString());
//获取获取X509Certificate类型的对象,这是证书类获取Certificate的子类,实现了更多方法
X509Certificate t=(X509Certificate)c;
//从信息中提取需要信息
System.out.println("版本号:"+t.getVersion());
System.out.println("序列号:"+t.getSerialNumber().toString(16));
System.out.println("主体名:"+t.getSubjectDN());
System.out.println("签发者:"+t.getIssuerDN());
System.out.println("有效期:"+t.getNotBefore());
System.out.println("签名算法:"+t.getSigAlgName());
byte [] sig=t.getSignature();
//签名值
PublicKey pk = t.getPublicKey();
byte [] pkenc=pk.getEncoded();
System.out.println("公钥:");
for (int i=0;i
总结
以上就是本文关于Java加密解密和数字签名完整代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!



