知识大全 谈谈Java加密技术(六)

Posted

篇首语:要让事情改变,行改变我自己,要让事情变得更好,先让自己变得更好。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 谈谈Java加密技术(六)相关的知识,希望对你有一定的参考价值。

谈谈Java加密技术(六)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  接下来我们介绍DSA数字签名 非对称加密的另一种实现

  DSA

  DSA Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种 被美国NIST作为DSS(DigitalSignature Standard) 简单的说 这是一种更高级的验证方式 用作数字签名 不单单只有公钥 私钥 还有数字签名 私钥加密生成数字签名 公钥验证数据及签名 如果数据和签名不匹配则认为验证失败!数字签名的作用就是校验数据在传输过程中不被修改 数字签名 是单向加密的升级!

  

  

  

  

  通过java代码实现如下

  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 PKCS EncodedKeySpec;import java security spec X EncodedKeySpec;import java util HashMap;import java util Map;

  /** * DSA安全编码组件 * * @author 梁栋 * @version  * @since  */public abstract class DSACoder extends Coder

  public static final String ALGORITHM = DSA ;

  /**     * 默认密钥字节数     *     * <pre>     * DSA     * Default Keysize      * Keysize must be a multiple of ranging from to (inclusive)      * </pre>     */    private static final int KEY_SIZE = ;

  /**     * 默认种子     */    private static final String DEFAULT_SEED = f a bbddd d a e ;

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

  /**     * 用私钥对信息生成数字签名     *     * @param data     *            加密数据     * @param privateKey     *            私钥     *     * @return     * @throws Exception     */    public static String sign(byte[] data String privateKey) throws Exception         // 解密由base 编码的私钥        byte[] keyBytes = decryptBASE (privateKey);

  // 构造PKCS EncodedKeySpec对象        PKCS EncodedKeySpec pkcs KeySpec = new PKCS EncodedKeySpec(keyBytes);

  // KEY_ALGORITHM 指定的加密算法        KeyFactory keyFactory = KeyFactory getInstance(ALGORITHM);

  // 取私钥匙对象        PrivateKey priKey = keyFactory generatePrivate(pkcs KeySpec);

  // 用私钥对信息生成数字签名        Signature signature = Signature getInstance(keyFactory getAlgorithm());        signature initSign(priKey);        signature update(data);

  return encryptBASE (signature sign());   

  /**     * 校验数字签名     *     * @param data     *            加密数据     * @param publicKey     *            公钥     * @param sign     *            数字签名     *     * @return 校验成功返回true 失败返回false     * @throws Exception     *     */    public static boolean verify(byte[] data String publicKey String sign)            throws Exception

  // 解密由base 编码的公钥        byte[] keyBytes = decryptBASE (publicKey);

  // 构造X EncodedKeySpec对象        X EncodedKeySpec keySpec = new X EncodedKeySpec(keyBytes);

  // ALGORITHM 指定的加密算法        KeyFactory keyFactory = KeyFactory getInstance(ALGORITHM);

  // 取公钥匙对象        PublicKey pubKey = keyFactory generatePublic(keySpec);

  Signature signature = Signature getInstance(keyFactory getAlgorithm());        signature initVerify(pubKey);        signature update(data);

  // 验证签名是否正常        return signature verify(decryptBASE (sign));   

  /**     * 生成密钥     *     * @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>( );        map put(PUBLIC_KEY publicKey);        map put(PRIVATE_KEY privateKey);

  return map;   

  /**     * 默认生成密钥     *     * @return 密钥对象     * @throws Exception     */    public static Map<String Object> initKey() throws Exception         return initKey(DEFAULT_SEED);   

  /**     * 取得私钥     *     * @param keyMap     * @return     * @throws Exception     */    public static String getPrivateKey(Map<String Object> keyMap)            throws Exception         Key key = (Key) keyMap get(PRIVATE_KEY);

  return encryptBASE (key getEncoded());   

  /**     * 取得公钥     *     * @param keyMap     * @return     * @throws Exception     */    public static String getPublicKey(Map<String Object> keyMap)            throws Exception         Key key = (Key) keyMap get(PUBLIC_KEY);

  return encryptBASE (key getEncoded());   

    再给出一个测试类

  import static junit Assert *;

  import java util Map;

  import junit Test;

  /** * * @author 梁栋 * @version  * @since  */public class DSACoderTest

  @Test    public void test() throws Exception         String inputStr = abc ;        byte[] data = inputStr getBytes();

  // 构建密钥        Map<String Object> keyMap = DSACoder initKey();

  // 获得密钥        String publicKey = DSACoder getPublicKey(keyMap);        String privateKey = DSACoder getPrivateKey(keyMap);

  System err println( 公钥:\\r + publicKey);        System err println( 私钥:\\r + privateKey);

  // 产生签名        String sign = DSACoder sign(data privateKey);        System err println( 签名:\\r + sign);

  // 验证签名        boolean status = DSACoder verify(data publicKey sign);        System err println( 状态:\\r + status);        assertTrue(status);

  

    控制台输出

  公钥:MIIBtzCCASwGByqGSM BAEwggEfAoGBAP /U EddRIpUt KnC s Of EbdSPO EAMMeP C USZpRV AIlH WT NWPq/xfW MPbLm Vs E gB b/JmYLdrmVClpJ+f AR ECLCT up / xhv O fnxqimFQ E+ P UewwI VBNaFpEy nXzrith yrv iIDGZ RSAHHAhUAl BQjxUjC yykrmCouuEC/BYHPUCgYEA +GghdabPd LvKtcNrhXuXmUr v OuqC+VdMCz HgmdRWVeOutRZT+ZxBxCBgLRJFnEj EwoFhO zwkyjMim TwWeotUfI o KOuHiuzpnWRbqN/C/ohNWLx+ J ASQ zKTxvqhRkImog /hWuWfBpKLZl Ae UlZAFMO/ PSSoDgYQAAoGAIu RUlcQLp PI MrbssOY+ uySVnp TULSv T VaHoKzsLHgGTrwOvsGA+V yCNl WDu D bSLF ligOj+SMOEaPk VyRTlLXZWGPsf Mfd XAbMeVyKDSHHVGbMjBScajf bXooYQMlyoHiOt/WrCo+mv efstMM PGo=

  私钥:MIIBTAIBADCCASwGByqGSM BAEwggEfAoGBAP /U EddRIpUt KnC s Of EbdSPO EAMMeP C USZpRV AIlH WT NWPq/xfW MPbLm Vs E gB b/JmYLdrmVClpJ+f AR ECLCT up / xhv O fnxqimFQ E+ P UewwI VBNaFpEy nXzrith yrv iIDGZ RSAHHAhUAl BQjxUjC yykrmCouuEC/BYHPUCgYEA +GghdabPd LvKtcNrhXuXmUr v OuqC+VdMCz HgmdRWVeOutRZT+ZxBxCBgLRJFnEj EwoFhO zwkyjMim TwWeotUfI o KOuHiuzpnWRbqN/C/ohNWLx+ J ASQ zKTxvqhRkImog /hWuWfBpKLZl Ae UlZAFMO/ PSSoEFwIVAIegLUtmm oQKQJTOiLugHTSjl/q

  签名:MC CFQCMg J/uZmF GuRpr TNq w nDwIUJCyYNah+HtbU NcQfy Ac LeLQs=

  状态:true

cha138/Article/program/Java/gj/201311/27470

相关参考

知识大全 Java加密技术(九)

Java加密技术(九)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在Java加密技术(八)中

知识大全 漫谈Java加密技术(二)

漫谈Java加密技术(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  接下来我们介绍对称加密

知识大全 漫谈Java加密技术(一)

漫谈Java加密技术(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  加密解密曾经是我一个毕

知识大全 Java技术进阶 基于Java的IDEA加密算法探讨

Java技术进阶基于Java的IDEA加密算法探讨  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 漫谈Java加密技术系列文章 一至十

漫谈Java加密技术系列文章一至十  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  漫谈Java加

知识大全 深入讨论JAVA字节码加密技术(2)

深入讨论JAVA字节码加密技术(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这个累加载器

知识大全 深入讨论JAVA字节码加密技术(1)

深入讨论JAVA字节码加密技术(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如果把的cl

知识大全 论Java加密技术与Windows的结合

论Java加密技术与Windows的结合  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  论Jav

知识大全 Java文件加密-spring属性文件加密

Java文件加密-spring属性文件加密  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  pac

知识大全 java中使用MD5加密算法进行加密

java中使用MD5加密算法进行加密  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在各种应用系