经典的数字签名算法-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 KEY_ALGORITHM = "RSA";

    private static final String SIGNATURE_ALGORITHM = "MD5withRSA";

    public static byte[] getprivateKey(Map<String, Object> keyMap) throws Exception {
        Key key = (Key) keyMap.get(PRIVATE_KEY);
        return key.getEncoded();
    }

    public static byte[] getPublicKey(Map<String, Object> keyMap) throws Exception {
        Key key = (Key) keyMap.get(PUBLIC_KEY);
        return key.getEncoded();
    }

    /**
     *  生产公私钥 保存到Map里面
     * @return
     * @throws Exception
     */
    public static Map<String, Object> initKey() throws Exception {
        Map<String, Object> keyMap = new HashMap<String, Object>(2);

        KeyPairGenerator keyPaiGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);

        keyPaiGen.initialize(KEY_SIZE);

        KeyPair pair = keyPaiGen.generateKeyPair();

        RSAPublicKey publicKey = (RSAPublicKey) pair.getPublic();

        RSAPrivateKey privateKey = (RSAPrivateKey) pair.getPrivate();

        keyMap.put(PUBLIC_KEY, publicKey);
        keyMap.put(PRIVATE_KEY, privateKey);

        return keyMap;
    }

    /**
     * 用私钥生产数字签名,
     * @param data
     * @param privateKey
     * @return
     * @throws Exception
     */
    public static byte[] sign(byte[] data, byte[] privateKey) throws Exception {
        PKCS8EncodedKeySpec pkc = new PKCS8EncodedKeySpec(privateKey);

        KeyFactory keyfactory = KeyFactory.getInstance(KEY_ALGORITHM);

        PrivateKey prikey = keyfactory.generatePrivate(pkc);

        Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM);
        sig.initSign(prikey);
        sig.update(data);

        return sig.sign();
    }

    /**
     * 用公钥decryption,检验私钥encryption的正确性,
     * @param data
     * @param publicKey
     * @param signs  私钥生产的encryption数字证书
     * @return
     * @throws Exception
     */
    public static boolean verify(byte[] data, byte[] publicKey, byte[] signs) throws Exception {
        X509EncodedKeySpec pkc= new X509EncodedKeySpec(publicKey);

        KeyFactory keyfactory = KeyFactory.getInstance(KEY_ALGORITHM);

        PublicKey pubkey = keyfactory.generatePublic(pkc);

        Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM);

        sig.initVerify(pubkey);
        sig.update(data);

        return sig.verify(signs);
    }

}
时间: 2024-10-10 18:06:01

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

Java数字签名算法--RSA

签名具有的特性: 安全性 抗否认性 数字签名:带有密钥(公钥.私钥)的消息摘要算法(使用私钥进行签名,使用公钥进行验证) 数字签名算法:RSA.DSA.ECDSA 数字签名特性: 验证数据完整性 认证数据来源 抗否认性 经典算法 MD.SHA两类 数字签名算法-RSA的执行过程 代码: package com.chengxuyuanzhilu.rsa; import java.security.InvalidKeyException; import java.security.KeyFactor

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

RSA/SHA1加密和数字签名算法在开放平台中的应用

加密算法 加密算法分为两大类:1.对称加密算法:2.非对称加密算法.   密钥个数 加密 解密 对称加密 一个 使用密钥加密 使用同一个密钥解密 非对称加密 两个,公钥和私钥 使用其中一把密钥加密 使用另外一把密钥解密 RSA非对称加密算法 RSA是目前应用最广泛的非对称加密算法,各种语言都支持RSA算法,如Java,Python,C++(openssl),Go(openssl),PHP(openssl),Object-C,Android,javascript等. 对于一个私钥匙.有且只有一个与

数字签名算法--1.RSA算法代码

package Imooc; 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.

数字签名算法--2.DSA

package Imooc; 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.

数字签名算法--3.ECDSA

package Imooc; 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.

Java 学习文章汇总

目前JAVA可以说是产业界和学术界最热门的语言,许多人都很急切想把JAVA学好. 但学习是需要步骤的,除非像电影中演的那样,能够把需要的专业技巧下载到脑海:主角只花了几秒下载资料,就马上具备飞行员的技巧,或是武侠小说中的运功传送内力的方式,否则花上一段时间苦学是少不了的.花时间,不打紧,就怕方法错误,事倍功半. java 学习文章推荐.java学习线路.java 知识图谱. HTML5 微数据 RDFa/微格式 使用 jQuery 的 Autocomplete 插件实现input输入提示功能 创

散列函数、消息摘要与数字签名

一, 散列函数(Hash function) 散列函数:任何一种能将任意大小数据映射为固定大小数据的函数,都能被称为散列函数.散列函数的返回值称为散列值.散列码,摘要或者简单散列. 也就是说散列函数能将任意长度的输入变换成固定长度的输出,该输出就是散列值.散列值空间通常远小于输入的空间. 散列函数的一些特性: 消息的长度不受限制 确定性:对于相同的输入(根据同一函数),它必须始终生成相同的散列值,如果两个散列值是不相同的,那么这两个散列值的原始输入也是不相同的, 但是对于不同的输入可能会散列成相