200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > java签名算法阻止 设置_java数字签名算法之RSA

java签名算法阻止 设置_java数字签名算法之RSA

时间:2020-10-15 21:52:35

相关推荐

java签名算法阻止 设置_java数字签名算法之RSA

© 版权声明:本文为博主原创文章,转载请注明出处

实例

1.项目结构

2.pom.xml

xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">

4.0.0

org.security

DigitalSignature

0.0.1-SNAPSHOT

jar

UTF-8

junit

junit

4.12

test

commons-codec

commons-codec

1.10

3.RSA.java

package org.security.rsa;

import java.security.KeyFactory;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.Signature;

import java.security.interfaces.RSAPrivateKey;

import java.security.interfaces.RSAPublicKey;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

import java.util.HashMap;

import java.util.Map;

import mons.codec.binary.Base64;

public class RSA {

private static final String str = "Digital signature algorithm RSA MD5WithRSA";

private static final String SECURITY = "RSA";// 加密方式

private static final String ALGORITHM = "MD5withRSA";// 加密算法

private static final String PUBLIC_KEY = "RSAPublicKey";// 公钥

private static final String PRIVATE_KEY = "RSAPrivateKey";// 秘钥

public static void main(String[] args) {

System.out.println("==========初始化密钥信息==========");

Map map = RSA.init();

System.out.println("=========密钥信息初始化成功=========");

byte[] private_key = RSA.getPrivateKey(map);

System.out.println("=============私钥为=============\n" + Base64.encodeBase64String(private_key));

byte[] public_key = RSA.getPublicKey(map);

System.out.println("=============公钥为=============\n" + Base64.encodeBase64String(public_key));

byte[] bs = RSA.sign(private_key);

System.out.println("=============签名为=============\n" + Base64.encodeBase64String(bs));

boolean result = RSA.verify(public_key, bs);

System.out.println("===========签名验证结果===========\n" + result);

}

/**

* 初始化密钥

*

* @return

*/

private static Map init() {

Map map = null;

try {

// 生成实现指定算法的KeyPairGenerator对象,用于生成密钥对

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(SECURITY);

keyPairGenerator.initialize(1024);// 初始化密钥长度

KeyPair keyPair = keyPairGenerator.generateKeyPair();// 生成密钥对

RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();// 获取公钥

RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();// 获取私钥

// 保存到map中

map = new HashMap();

map.put(PUBLIC_KEY, rsaPublicKey);

map.put(PRIVATE_KEY, rsaPrivateKey);

} catch (Exception e) {

e.printStackTrace();

}

return map;

}

/**

* 用私钥生成签名

*

* @param privateKey

* 私钥字节数组

* @return

*/

private static byte[] sign(byte[] privateKey) {

byte[] signByte = null;

try {

// 根据给定的编码密钥创建一个新的PKCS8EncodedKeySpec对象,指定PKCS#8标准为密钥规范管理的编码格式

PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(privateKey);

// 实例化密钥工厂对象,将密钥转换成密钥规范

KeyFactory keyFactory = KeyFactory.getInstance(SECURITY);

// 根据提供的密钥规范生成私钥对象

PrivateKey key = keyFactory.generatePrivate(pkcs8EncodedKeySpec);

// 实例化实现指定签名算法的Signature对象

Signature signature = Signature.getInstance(ALGORITHM);

// 根据私钥对象初始化签名对象

signature.initSign(key);

// 使用指定的byte数组更新要签名或验证的数据

signature.update(str.getBytes());

// 返回所有已更新数据的签名字节

signByte = signature.sign();

} catch (Exception e) {

e.printStackTrace();

}

return signByte;

}

/**

* 用公钥验证签名

*

* @param publicKey

* 公钥字节数组

* @param signByte

* 签名字节数组

* @return

*/

public static boolean verify(byte[] publicKey, byte[] signByte) {

boolean result = false;

try {

// 根据给定的编码密钥创建一个新的X509EncodedKeySpec对象

X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKey);

// 实例化密钥工厂对象,将密钥转换成密钥规范

KeyFactory keyFactory = KeyFactory.getInstance(SECURITY);

// 根据提供的密钥规范生成公钥对象

PublicKey key = keyFactory.generatePublic(x509EncodedKeySpec);

// 实例化实现指定签名算法的Signature对象

Signature signature = Signature.getInstance(ALGORITHM);

// 根据公钥对象初始化用于验证的对象

signature.initVerify(key);

// 使用指定的byte数组更新要签名或验证的数据

signature.update(str.getBytes());

// 验证传入的签名

result = signature.verify(signByte);

} catch (Exception e) {

e.printStackTrace();

}

return result;

}

/**

* 获取私钥

*

* @param map

* 密钥map集合

* @return

*/

public static byte[] getPrivateKey(Map map) {

RSAPrivateKey key = (RSAPrivateKey) map.get(PRIVATE_KEY);

return key.getEncoded();

}

/**

* 获取私钥

*

* @param map

* 密钥map集合

* @return

*/

public static byte[] getPublicKey(Map map) {

RSAPublicKey key = (RSAPublicKey) map.get(PUBLIC_KEY);

return key.getEncoded();

}

}

4.效果预览

==========初始化密钥信息==========

=========密钥信息初始化成功=========

=============私钥为=============

MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIsbpXWv1jJ/8sLNPC9dWqBmXhyx7MFT3XwyxY9uO1mLJr1biL2hytY+rFeGL+EChxlnCSS4H8M17fVP7nh5Kk5FP7sTqp3hewp9PLpKFsytP5T3urQYbQ5QtKvH4oaUk4Uu8IJ1Bc0cTNvxeSulvMMzxk+wuVEdxfO3tBLUWmjdAgMBAAECgYBQxVO0Ws3PcrVdYNeyVM07V1UL6k+jDXQMGlrV5lZ1rrNmvZBPM3NYJPnitBp21wXkvQv1Eyf2LAkoKCo6L3hdMPXpe19OgFdIHm13kV7rfZNxxGE+3ZFv5EW6O6dC7dK1fUXlAdi1Yvl3nVQx+3e2h+7CTW/fVxb9AH14IjO24QJBAL6b+aGt1v5iH0yAHG2OV30B/0hzW1ImVOu4Kx6lgobVcQkwkUVu00gkI5p7Xs/RYtmVIzR9PoYKrDCE5qGNVGUCQQC61KJnIXZsHfDnaQcq3vsFa7SzDzfKgXxHCBIGhJlLiWFisq4wWhPOO7ADOOz5lyl8TGDGyYTaJJBDGx7hWk8ZAkADUAynnbDV3Pi0SKm10bp9hrJcHP0iUV46donxT2kUVNNRGJH9xe5QG6iuv6QnMnloVKo2+FJE3Byf/z9O4XjtAkBEzColefAGrhvYyxcllUiwXVIEIdV0j6v46CLjHY7pfuRKmOuFyJXEerw844h3/E79g46bhPeT8KTi4SjE6SF5AkBn37pDFVp8mabYzDaEuoUB+WoAfLwPlNA+KQHFHoDzHEjRXvXbfObRViB5/qKkNNQiVXEfcugsA6IDlOGQezED

=============公钥为=============

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLG6V1r9Yyf/LCzTwvXVqgZl4csezBU918MsWPbjtZiya9W4i9ocrWPqxXhi/hAocZZwkkuB/DNe31T+54eSpORT+7E6qd4XsKfTy6ShbMrT+U97q0GG0OULSrx+KGlJOFLvCCdQXNHEzb8XkrpbzDM8ZPsLlRHcXzt7QS1Fpo3QIDAQAB

=============签名为=============

ODGCnrrBV/1SXfB65SHYWbdgNAuY8QbfAzWGeRscMhGCudfQk9cnLzHVQkhlC9eXruTvjQqQSmBNLmGdegUlAh+bPi/EkqReidD0efsLSy4FQSJIdmFVW6Xl3FuAqzIqidPLPFk0rFDK/DJzGVQtUYm5rKDap0zKMxe/P3/6bbs=

===========签名验证结果===========

true

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。