签名具有的特性:

  1. 安全性
  2. 抗否认性

数字签名:带有密钥(公钥、私钥)的消息摘要算法(使用私钥进行签名,使用公钥进行验证)

数字签名算法:RSA、DSA、ECDSA

数字签名特性:

  1. 验证数据完整性
  2. 认证数据来源
  3. 抗否认性

经典算法

MD、SHA两类

数字签名算法-RSA的执行过程

代码:

package com.chengxuyuanzhilu.rsa;

import java.security.InvalidKeyException;
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.Signature;
import java.security.SignatureException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec; /**
* <p>微信公众号:程序员之路</p>
* <p>博客:http://www.cnblogs.com/chengxuyuanzhilu</p>
* @ClassName: CXYZL_RSA
* @Description: 数组签名算法——RSA
* @author 付成刚
* @date 2016年2月17日 上午7:23:02
*/
public class CXYZL_RSA {
//要签名和验证的签名内容
private static String src = "chengxuyuanzhilu rsa"; public static void main(String[] args) {
jdkRSA();
} public static void jdkRSA(){ CXYZL_RSA cxyzl_RSA = new CXYZL_RSA();
try {
//1.初始化密钥,产生公钥私钥对
Object[] keyPairArr = cxyzl_RSA.initSecretkey();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPairArr[0];
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPairArr[1]; //2.执行签名
byte[] result = cxyzl_RSA.executeSignature(rsaPrivateKey); //3.验证签名
boolean bool = cxyzl_RSA.verifySignature(rsaPublicKey,result);
System.out.println("RSA-MD5withRSA数字签名算法运算结果:"+bool);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* @Title: initSecretkey
* @Description: 初始化密钥,生成公钥私钥对
* @return Object[] 0 公钥,1 私钥
* @author 微信公众号:程序员之路
* @throws NoSuchAlgorithmException
* @date 2016年2月17日 上午7:31:06
*/
private Object[] initSecretkey() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); Object[] keyPairArr = new Object[2];
keyPairArr[0] = rsaPublicKey;
keyPairArr[1] = rsaPrivateKey; return keyPairArr;
} /**
* @Title: executeSignature
* @Description: 执行签名
* @return byte[] 签名后的内容
* @author 微信公众号:程序员之路
* @throws InvalidKeyException
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
* @throws SignatureException
* @date 2016年2月17日 上午7:44:49
*/
private byte[] executeSignature(RSAPrivateKey rsaPrivateKey) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, SignatureException{
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(src.getBytes());
byte[] result = signature.sign(); return result;
} /**
* @Title: verifySignature
* @Description: 验证签名
* @param rsaPublicKey 公钥
* @param result 私钥执行签名的结果
* @return boolean 验证结果
* @author 微信公众号:程序员之路
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
* @throws InvalidKeyException
* @throws SignatureException
* @date 2016年2月17日 上午7:53:37
*/
private boolean verifySignature(RSAPublicKey rsaPublicKey,byte[] result) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException{
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Signature signature = Signature.getInstance("MD5withRSA");
signature.initVerify(publicKey);
signature.update(src.getBytes());
boolean bool = signature.verify(result); return bool;
} }

Java数字签名算法--RSA的更多相关文章

  1. 数字签名算法rsa

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

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

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

  3. java数字签名算法之RSA

    © 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

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

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

  5. 与非java语言使用RSA加解密遇到的问题:algid parse error, not a sequence

    遇到的问题 在一个与Ruby语言对接的项目中,决定使用RSA算法来作为数据传输的加密与签名算法.但是,在使用Ruby生成后给我的私钥时,却发生了异常:IOException: algid parse ...

  6. ECDSA数字签名算法

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

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

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

  8. Java中使用RSA算法加密

    Java中使用RSA算法加密 概述 RSA加密算法是一种非对称加密算法 RSA加密的方式 使用公钥加密的数据,利用私钥进行解密 使用私钥加密的数据,利用公钥进行解密 RSA是一对密钥.分别是公钥和私钥 ...

  9. JAVA,NET RSA密钥格式转换

    JAVA和NET RSA密钥格式相互转换(公钥,私钥) 做了一个小项目遇到java和.net非对称加密问题,java的公钥和私钥就直接是一个字符串的形式展示的,但是.net是以xml简单包裹形式展示的 ...

随机推荐

  1. CSU 1808 地铁(最短路变形)

    http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1808 题意: Bobo 居住在大城市 ICPCCamp. ICPCCamp 有 n 个地铁站, ...

  2. HDU 6129 Just do it(杨辉三角)

    http://acm.hdu.edu.cn/showproblem.php?pid=6129 题意: 给出数组a,并且bi=a1^a2^a3...^ai,并且现在会重复m次,求出最后的b数组. 思路: ...

  3. oadrunner11录制手机app脚本

    oadrunner11录制手机app视频:http://pan.baidu.com/s/1bnc4cHL 注意点: 1.手机和loadrunner安装的电脑必须在同一网段2.视频的www.baidu. ...

  4. pandas 处理数据中NaN数据

    使用dropna()函数去掉NaN的行或列 import pandas as pd import pickle import numpy as np dates = pd.date_range() d ...

  5. TeamViewer 说明截图

  6. 《剑指offer》第二十三题(链表中环的入口结点)

    // 面试题23:链表中环的入口结点 // 题目:一个链表中包含环,如何找出环的入口结点?例如,在图3.8的链表中, // 环的入口结点是结点3. #include <iostream> ...

  7. ASCII 和 Unicode 编码的由来

    大话数据结构上的说明: 网络博文的说明:

  8. 修改unity变量名但不丢失序列化值

    using UnityEngine; using UnityEngine.Serialization; public class LgsTest : MonoBehaviour { [Formerly ...

  9. 链表排序 Sort List

    2018-08-11 23:50:30 问题描述: 问题求解: 解法一.归并排序 public ListNode sortList(ListNode head) { if (head == null ...

  10. Java下载https文件上传到阿里云oss服务器

    Java下载https文件上传到阿里云oss服务器 今天做了一个从Https链接中下载音频并且上传到OSS服务器,记录一下希望大家也少走弯路. 一共两个类: 1 .实现自己的证书信任管理器类 /** ...