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

实例

1.项目结构

2.pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.security</groupId>
<artifactId>DigitalSignature</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
</dependencies>
</project>

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 org.apache.commons.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<String, Object> 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<String, Object> init() { Map<String, Object> 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<String, Object>();
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<String, Object> map) { RSAPrivateKey key = (RSAPrivateKey) map.get(PRIVATE_KEY);
return key.getEncoded(); } /**
* 获取私钥
*
* @param map
* 密钥map集合
* @return
*/
public static byte[] getPublicKey(Map<String, Object> 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

参考:http://www.imooc.com/video/6154

java数字签名算法之RSA的更多相关文章

  1. Java数字签名算法--RSA

    签名具有的特性: 安全性 抗否认性 数字签名:带有密钥(公钥.私钥)的消息摘要算法(使用私钥进行签名,使用公钥进行验证) 数字签名算法:RSA.DSA.ECDSA 数字签名特性: 验证数据完整性 认证 ...

  2. 第十四章 数字签名算法--RSA

    注意:本节内容主要参考自 <Java加密与解密的艺术(第2版)>第9章“带密钥的消息摘要算法--数字签名算法” <大型分布式网站架构(设计与实践)>第3章“互联网安全架构” 1 ...

  3. 数字签名算法rsa

    数字签名算法消息传递模型 由消息发送方构建密钥对,这里由甲方完成. 由消息发送方公布公钥至消息接收方,这里由甲方将公钥公布给乙方. 注意如加密算法区别,这里甲方使用私钥对数据签名,数据与签名形成一则消 ...

  4. JAVA加解密 -- 数字签名算法

    数字签名 – 带有密钥的消息摘要算法 作用:验证数据完整性.认证数据来源.抗否认(OSI参考模型) 私钥签名,公钥验证 RSA 包含非对称算法和数字签名算法 实现代码: //1.初始化密钥 KeyPa ...

  5. ECDSA数字签名算法

    一.ECDSA概述 椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟.ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准.它在 ...

  6. .NET Core加解密实战系列之——消息摘要与数字签名算法

    目录 简介 功能依赖 消息摘要算法 MD算法 家族发展史 应用场景 代码实现 MD5 示例代码 SHA算法 应用场景 代码实现 SHA1 SHA256 示例代码 MAC算法 HMAC算法的典型应用 H ...

  7. Java实现文件的RSA和DES加密算法

    根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密) 对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密 ...

  8. 全面解决.Net与Java互通时的RSA加解密问题,使用PEM格式的密钥文件

    作者: zyl910 一.缘由 RSA是一种常用的非对称加密算法.所以有时需要在不用编程语言中分别使用RSA的加密.解密.例如用Java做后台服务端,用C#开发桌面的客户端软件时. 由于 .Net.J ...

  9. JAVA的非对称加密算法RSA——加密和解密

    原文转载至:https://www.cnblogs.com/OnlyCT/p/6586856.html 第一部分:RSA算法原理与加密解密 一.RSA加密过程简述 A和B进行加密通信时,B首先要生成一 ...

随机推荐

  1. DRF的版本和认证

    DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们项目越来越更新~版本就越来越多~~我们不可能新的版本出了~ ...

  2. (7)oracle数据类型

    字符型 char 定长 最大2000字符   例如 char(20) 表示定长20  不够的补空格   定长查询速度快 varchar2 变长 最大4000字符  省空间 clob 字符型大对象 最大 ...

  3. Codeforces Round #447 (Div. 2) B. Ralph And His Magic Field【数论/组合数学】

    B. Ralph And His Magic Field time limit per test 1 second memory limit per test 256 megabytes input ...

  4. Codeforces Gym 101194G Pandaria (2016 ACM-ICPC EC-Final G题, 并查集 + 线段树合并)

    题目链接  2016 ACM-ICPC EC-Final Problem G 题意  给定一个无向图.每个点有一种颜色. 现在给定$q$个询问,每次询问$x$和$w$,求所有能通过边权值不超过$w$的 ...

  5. Python的并发并行[1] -> 线程[2] -> 锁与信号量

    锁与信号量 目录 添加线程锁 锁的本质 互斥锁与可重入锁 死锁的产生 锁的上下文管理 信号量与有界信号量 1 添加线程锁 由于多线程对资源的抢占顺序不同,可能会产生冲突,通过添加线程锁来对共有资源进行 ...

  6. Python的程序结构[8] -> 装饰器/Decorator -> 装饰器浅析

    装饰器 / Decorator 目录 关于闭包 装饰器的本质 语法糖 装饰器传入参数 1 关于闭包 / About Closure 装饰器其本质是一个闭包函数,为此首先理解闭包的含义. 闭包(Clos ...

  7. Spfa【P1813】拯救小tim_NOI导刊2011提高(02)

    Description 小tim在游乐场,有一天终于逃了出来!但是不小心又被游乐场的工作人员发现了„„所以你的任务是安全地把小tim护送回家.但是,A市复杂的交通状况给你出了一大难题. A市一共有n个 ...

  8. ORACLE查询当前连接的用户信息及操作的SQL语句

    ORACLE--查询当前连接的用户信息及操作的SQL语句    select sid,      status,      v$session.username 用户名,      last_call ...

  9. php程序无法使用localhost连接数据库解决方法(linux)

    php程序无法使用localhost连接数据库解决方法(linux) 出现这种情况是因为PHP无法正确获取mysql.sock 在php.ini文件中指定即可解决问题. 修改如下: 找到 mysql. ...

  10. vue的表单的简单介绍 input radio checkbox等表单特性

    在vue中我们可以通过v-model来为表单元素实现双向绑定 1:v-model指令 数据的双向绑定 双向绑定是说我们不仅仅可以通过数据(M)的改变去影响视图(V),还是当视图的内容改变(V)去影响模 ...