Java数字签名算法--RSA

签名具有的特性:

  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;
    }

}
时间: 2024-11-03 05:40:42

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

经典的数字签名算法-RSA

记录: public abstract class RSACoderSignature { private static final String PRIVATE_KEY = "RSAPrivate_Key"; private static final String PUBLIC_KEY = "RSAPublic_key"; private static final int KEY_SIZE = 512; private static final String KE

RSA 数字签名算法(Java版)

数字签名算法Java版 还是上代码吧 public static final String SIGN_ALGORITHMS = "SHA1WithRSA"; /** * RSA签名 * @param content 待签名数据 * @param privateKey 私钥 * @param input_charset 编码格式 * @return 签名值 */ public static String sign(String content, String privateKey, St

ECDSA数字签名算法

一.ECDSA概述 椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟.ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准.它在1998年既已为ISO所接受,并且包含它的其他一些标准亦在ISO的考虑之中.与普通的离散对数问题(discrete logarithm problem  DLP)和大数分解问题(integer factorization problem  IFP)不同,椭圆曲线离散对数问题(elliptic cur

java数字字符串累加1的解决方案

近期操作项目遇到这样的问题,研究了下搞出了一个解决方案. //num也可以是在数字字符串里面截取的,比如我有14位的数字字符串前六位是市级,7,8位代表县区,后两位代表乡镇,最后四位是累计+1的,这个时候你就可以根据前10位查出最大的是多少,然后用最大的+1得出新的最大的.. //你要+1的字符串 String num="0000"; //转成整数并执行累加操作,但是可能位数变少了,怎么办呢? int i=Integer.valueOf(Num)+1; //为了拼接字符串使用 Stri

关于《Java数字图像处理-编程技巧与应用实践》一书 源代码

关于<Java数字图像处理-编程技巧与应用实践>一书 源代码 本书所有的源代码我已经整理上传到华章图书的官方网站与 我自己的GITHUB上,本人GITHUB的地址如下: https://github.com/gloomyfish/mybook-java-imageprocess其 中书中的多数内容在本人的博客专栏上面有覆盖,但是不完全 是博客内容的翻版,阅读本人博客想找可以运行源代码的读者 可以到github上自己下载,如果发现有任何源代码错误,请给我 发邮件或者留言,本人感激不尽. 特此声明

【转】Java数字抽奖游戏核心代码

1. [代码][Java]代码    package com.luiszhang.test; import java.util.Arrays; /** * NumberLotteryGame * 一个简单的数字彩票游戏类 * @author LuisZhang * 参考了core java 8th中的例3-7的设计思想 */public class NumberLotteryGame {    private int gamesNumber;    // 生成游戏的数量,为以后多线程扩展做考虑 

Java培训 关于RSA加密算法有哪些应用呢?

Java培训 关于RSA加密算法有哪些应用呢? RSA加密算法是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击. Java培训关于RSA加密算法有哪些应用呢?以下举一个数据库身份验证的案例. 在使用数据集进行身份认证时,密码存在数据库中,认证时用户输入的密码与数据库中密码相同则认证通过,若数据库被破解了则对系统造成威胁,怎样保证系统安全呢?这里就可以应用RSA加密算法,对权限加密. 思路: 就是在url中传用户名密码时,先把用户名进行翻转,然后再进行加密,如输入的密码为

Java非对称加密算法--RSA加密算法

Java非对称加密算法--RSA加密算法          RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用.RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA就是他们三人姓氏开头字母拼在一起组成的. 1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相

JAVA,NET RSA密钥格式转换

JAVA和NET RSA密钥格式相互转换(公钥,私钥) 不多说直接上代码,需要引用开源类库BouncyCastle.Crypto.dll 也可以在这里下载http://downloads.bouncycastle.org/csharp/bccrypto-net-1.7-bin.zip 以下为转化代码 1 using System; 2 using System.Xml; 3 using Org.BouncyCastle.Asn1.Pkcs; 4 using Org.BouncyCastle.As