`
sillycat
  • 浏览: 2537800 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

bouncycastle(7)Learn from others DSA

    博客分类:
  • JAVA
 
阅读更多
bouncycastle(7)Learn from others DSA

DSA (Digital Signature Algorithm)

A will generate the key pair, share the public key to B.
A will use private key to generate the signature, send the signature and data to B.
B will use public key to validate the signature and data.

package com.sillycat.easycastle.encryption;

import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.interfaces.DSAPrivateKey;
import java.security.interfaces.DSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

public abstract class DSACoder extends Coder {

     public static final String ALGORITHM = "DSA";
     
    /**
     * default key size
     * <pre>
     * DSA
     * Default Keysize 1024 
     * Keysize must be a multiple of 64, ranging from 512 to 1024 (inclusive).
     * </pre>
     */
    private static final int KEY_SIZE = 1024;

    /**
     * default seed
     */
    private static final String DEFAULT_SEED = "0f22507a10bbddd07d8a3082122966e3";

    private static final String PUBLIC_KEY = "DSAPublicKey";
    private static final String PRIVATE_KEY = "DSAPrivateKey";

    /**
     * use private key to signature the data
     * @param data
     * @param privateKey
     *
     * @return
     * @throws Exception
     */
    public static String sign(byte[] data, String privateKey) throws Exception {
         // decrypt the private key
        byte[] keyBytes = decryptBASE64(privateKey);
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
        // KEY_ALGORITHM
        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
        // convert to private key object
        PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
        // signature the data
        Signature signature = Signature.getInstance(keyFactory.getAlgorithm());
        signature.initSign(priKey);
        signature.update(data);
        return encryptBASE64(signature.sign());
    }

    /**
     * validate the signature
     * @param data
     * @param publicKey
     * @param sign
     * @return true false
     * @throws Exception
     */
    public static boolean verify(byte[] data, String publicKey, String sign)
            throws Exception {
        byte[] keyBytes = decryptBASE64(publicKey);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        // ALGORITHM
        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
        // convert to public key object
        PublicKey pubKey = keyFactory.generatePublic(keySpec);

        Signature signature = Signature.getInstance(keyFactory.getAlgorithm());
        signature.initVerify(pubKey);
        signature.update(data);
        return signature.verify(decryptBASE64(sign));
    }
    /**
     * generate the key pair
     * @param seed
     * @return
     * @throws Exception
     */
    public static Map<String, Object> initKey(String seed) throws Exception {
        KeyPairGenerator keygen = KeyPairGenerator.getInstance(ALGORITHM);
        SecureRandom secureRandom = new SecureRandom();
        secureRandom.setSeed(seed.getBytes());
        keygen.initialize(KEY_SIZE, secureRandom);
        KeyPair keys = keygen.genKeyPair();
        DSAPublicKey publicKey = (DSAPublicKey) keys.getPublic();
        DSAPrivateKey privateKey = (DSAPrivateKey) keys.getPrivate();
        Map<String, Object> map = new HashMap<String, Object>(2);
        map.put(PUBLIC_KEY, publicKey);
        map.put(PRIVATE_KEY, privateKey);
        return map;
    }
    /**
     * return key map object
     * @return
     * @throws Exception
     */
    public static Map<String, Object> initKey() throws Exception {
        return initKey(DEFAULT_SEED);
    }
    /**
     * return private key
     * @param keyMap
     * @return
     * @throws Exception
     */
    public static String getPrivateKey(Map<String, Object> keyMap)
            throws Exception {
        Key key = (Key) keyMap.get(PRIVATE_KEY);
        return encryptBASE64(key.getEncoded());
    }
    /**
     * return public key
     * @param keyMap
     * @return
     * @throws Exception
     */
    public static String getPublicKey(Map<String, Object> keyMap)
            throws Exception {
        Key key = (Key) keyMap.get(PUBLIC_KEY);
        return encryptBASE64(key.getEncoded());
    }
}


The test case will be as follow:
package com.sillycat.easycastle.encryption;

importstatic org.junit.Assert.assertTrue;

import java.util.Map;

import org.junit.Test;

publicclass DSACoderTest {

@Test
publicvoid test() throws Exception {
String inputStr = "hello world";
byte[] data = inputStr.getBytes();

// init the key pair
Map<String, Object> keyMap = DSACoder.initKey();

// get the public and private key
String publicKey = DSACoder.getPublicKey(keyMap);
String privateKey = DSACoder.getPrivateKey(keyMap);

System.out.println("public key:\r" + publicKey);
System.out.println("private key:\r" + privateKey);

// generate the signature
String sign = DSACoder.sign(data, privateKey);
System.out.println("signature:\r" + sign);

// validate the signature
boolean status = DSACoder.verify(data, publicKey, sign);
System.out.println("status:\r" + status);
assertTrue(status);
}

}


references:
http://snowolf.iteye.com/blog/382749


分享到:
评论

相关推荐

    BouncyCastle依赖.zip

    BouncyCastle是一个强大的Java安全库,它为加密、数字签名、证书处理以及许多其他安全功能提供了全面的支持。在Android开发中,BouncyCastle扮演着重要角色,特别是在处理SSL/TLS连接、加密通信以及生成和验证X.509...

    C# BouncyCastle实现带原文数据PKCS#7 签名、验签

    BouncyCastle是一个强大的开源加密库,它支持多种加密算法和标准,包括PKCS#7(也称为CMS,Cryptographic Message Syntax)。 PKCS#7是一种标准格式,用于打包和加密数字签名、证书和数据。它允许在一个单一的结构...

    bouncycastle jar包

    Bouncy Castle实现了PKCS#7(用于数据封装和签名)、PKCS#12(用于存储私钥和证书)、PKCS#5(用于密码化)和PKCS#11(用于硬件加密设备接口)等标准。 **OpenSSL兼容** Bouncy Castle还提供了一个名为BCrypt的...

    org.bouncycastle 加密算法包 最新1.69版

    Bouncy Castle 实现了 PKCS#1、PKCS#5、PKCS#7、PKCS#8 和 PKCS#12 等标准,这些标准涉及密钥管理、密码存储和数据封装等。 9. **JCE 兼容性**: 作为 JCE 的扩展,Bouncy Castle 可以作为替代提供更丰富的加密...

    C# BouncyCastle实现带原文数据PKCS#7 签名

    本文将详细讲解如何使用C#语言和BouncyCastle库来实现带原文数据的PKCS#7签名。 PKCS#7(Public-Key Cryptography Standards #7)是由RSA Security提出的一种标准,它定义了证书、证书撤销列表(CRL)的格式以及...

    BouncyCastle.Crypto.dll 版本1.8.6 C#语言

    1. **加密算法支持**:BouncyCastle.Crypto.dll 提供了多种加密算法的实现,包括对称加密(如AES、Blowfish、DES)、非对称加密(如RSA、DSA、ECDSA)、哈希函数(如SHA-1、SHA-256、MD5)和消息认证码(MAC)。...

    BouncyCastle.Crypto.dll

    《BouncyCastle.Crypto.dll:理解.NET平台的加密利器》 在网络安全日益重要的今天,加密技术扮演了至关重要的角色。BouncyCastle库是Java和.NET平台上广泛使用的加密库之一,而"BouncyCastle.Crypto.dll"正是.NET...

    BouncyCastle.dll C#依赖工具,用作数据的加解密辅助类

    7. **随机数生成器**:加密过程中需要使用高质量的随机数,Bouncy Castle提供了安全的随机数生成器。 在实际应用中,开发人员可以通过引用BouncyCastle.Crypto.dll来利用这些功能。通过它的API,可以轻松地集成加密...

    BouncyCastle.Crypto.dll 版本1.8.1

    2. **广泛的密码学算法**:BouncyCastle 支持众多加密算法,如AES、DES、3DES、Blowfish、RSA、DSA、ECDSA等,还包括哈希函数如SHA-1、SHA-256、MD5等,以及消息认证码(MAC)和伪随机数生成器(PRNG)。 3. **PKCS...

    BouncyCastle.Crypto.rar

    BouncyCastle.Crypto.dll是.NET版本的核心组件,包含了大量加密算法的实现,如对称加密(如AES、DES、3DES)、非对称加密(RSA、DSA、ECC)、哈希算法(MD5、SHA-1、SHA-256等)以及消息认证码(MAC)等。...

    Bouncy Castle 1.64 API及制作工具

    Bouncy Castle 支持多种加密算法,包括对称加密(如 AES、DES、3DES)、非对称加密(RSA、DSA、ECDSA)、哈希函数(MD5、SHA-1、SHA-256 及以上)、消息认证码(MAC)等。这些算法的实现使得开发人员能够灵活选择...

    bouncycastle1.59 帮助文档(包含html源文件制作工具)

    《BouncyCastle1.59帮助文档:深入理解与CHM制作详解》 BouncyCastle,作为Java和.NET平台上广泛使用的开源加密库,为开发者提供了丰富的加密算法、密码学标准接口以及证书处理功能。这份“BouncyCastle1.59帮助...

    org.bouncycastle完整资源包

    1. **加密算法支持**:`org.bouncycastle`提供了大量的对称和非对称加密算法,例如AES(高级加密标准)、Blowfish、DES(数据加密标准)、3DES(三重DES)、RSA(公钥加密标准)、DSA(数字签名算法)等。...

    BouncyCastle.Crypto.dllC#下的BouncyCastle

    BouncyCastle是JAVA专属库,但出来了C#的库。这个非常实用。仅仅一个dll文件

    BouncyCastle.Crypto.dll 1.8.2

    《BouncyCastle.Crypto.dll 1.8.2:深入解析加密库的奥秘》 在信息技术领域,安全是至关重要的。特别是在网络通信、数据存储和传输等方面,强大的加密技术是保障信息安全的基础。BouncyCastle.Crypto.dll是这样一个...

    bouncycastle集合包

    在这个集合包中,我们找到了四个不同版本的BouncyCastle相关jar文件,分别如下: 1. **bcprov-jdk16-1.46.jar**:这是BouncyCastle的主要提供者包,主要用于Java平台。"bcprov"代表BouncyCastle Provider,"jdk16...

    BouncyCastle.Crypto.dll,itextsharp.dll

    Bouncy Castle不仅提供了基本的加密操作,如加解密、数字签名和哈希,还支持更高级的功能,如PKCS#7(用于封装和验证数据)、PGP(用于电子邮件加密)以及X.509证书管理。这个库以其灵活、高效和全面的特性,成为了...

Global site tag (gtag.js) - Google Analytics