Java中加密算法介绍及其实现( 八 )


加密解密方式与RSA相同
数字签名
数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名 , 但是使用了公钥加密领域的技术实现 , 用于鉴别数字信息的方法 。一套数字签名通常定义两种互补的运算 , 一个用于签名 , 另一个用于验证 。
数字签名 , 就是只有信息的发送者才能产生的别人无法伪造的一段数字串 , 这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明 。
数字签名是非对称密钥加密技术与数字摘要技术的应用 。
特点: 数据完整性验证、认证数据来源、抗否认等
RSA算法
加解密流程

Java中加密算法介绍及其实现

文章插图
仅仅实现签名 验签
public static void jdkRSA() throwsException{//初始化秘钥KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(512);KeyPair keyPair =keyPairGenerator.generateKeyPair();RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();//执行签名//用私钥签名PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());KeyFactory keyFactory = KeyFactory.getInstance("RSA");PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);Signature signature = Signature.getInstance("MD5withRSA");signature.initSign(privateKey);signature.update(BASE_STRING.getBytes());byte[] result = signature.sign();System.out.println("JDK RSA 签名:"+ Hex.toHexString(result));//用公钥验签X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());keyFactory = KeyFactory.getInstance("RSA");PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);signature = Signature.getInstance("MD5withRSA");signature.initVerify(publicKey);signature.update(BASE_STRING.getBytes());boolean res = signature.verify(result);System.out.println("JDK RSA 验签:"+res);}
DSA算法
DSA 算法和RSA算法完全相似
public static void DSA() throws Exception{//创建秘钥KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");keyPairGenerator.initialize(512);KeyPair keyPair = keyPairGenerator.generateKeyPair();DSAPublicKey dsaPublicKey = (DSAPublicKey) keyPair.getPublic();DSAPrivateKey dsaPrivateKey = (DSAPrivateKey) keyPair.getPrivate();//签名PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded());KeyFactory keyFactory = KeyFactory.getInstance("DSA");PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);Signature signature = Signature.getInstance("SHA1withDSA");signature.initSign(privateKey);signature.update(BASE_STRING.getBytes());byte[] result = signature.sign();System.out.println("JDK DSA 签名:"+ Base64.encodeBase64String(result));//验签X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(dsaPublicKey.getEncoded());keyFactory = KeyFactory.getInstance("DSA");PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);signature = Signature.getInstance("SHA1withDSA");signature.initVerify(publicKey);signature.update(BASE_STRING.getBytes());boolean res = signature.verify(result);System.out.println("JDK DSA 验签是否通过:"+res);}
ECDSA算法(椭圆曲线数字签名算法)
速度快、强度高、签名短的特点;
序列号验证算法
加解密流程
Java中加密算法介绍及其实现

文章插图
public static void jdkECDSA() throws Exception{//生成秘钥KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");keyPairGenerator.initialize(256);KeyPair keyPair = keyPairGenerator.generateKeyPair();ECPublicKey ecPublicKey = (ECPublicKey) keyPair.getPublic();ECPrivateKey ecPrivateKey = (ECPrivateKey) keyPair.getPrivate();//签名PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ecPrivateKey.getEncoded());KeyFactory keyFactory = KeyFactory.getInstance("EC");PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);Signature signature = Signature.getInstance("SHA256withECDSA");signature.initSign(privateKey);signature.update(BASE_STRING.getBytes());byte[] result = signature.sign();System.out.println("JDK ECDSA 签名:"+ Base64.encodeBase64String(result));//验签X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ecPublicKey.getEncoded());keyFactory = KeyFactory.getInstance("EC");PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);signature = Signature.getInstance("SHA256withECDSA");signature.initVerify(publicKey);signature.update(BASE_STRING.getBytes());boolean res = signature.verify(result);System.out.println("JDK ECDSA 验签结果:"+res);}