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

Posted

篇首语:年轻只知学习营利,乃生命中最黯淡之时刻。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 谈谈Java加密技术(七)相关的知识,希望对你有一定的参考价值。

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

  ECC

  ECC Elliptic Curves Cryptography 椭圆曲线密码编码学 是目前已知的公钥体制中 对每比特所提供加密强度最高的一种体制 在软件注册保护方面起到很大的作用 一般的序列号通常由该算法产生

  当我开始整理《Java加密技术(二)》的时候 我就已经在开始研究ECC了 但是关于Java实现ECC算法的资料实在是太少了 无论是国内还是国外的资料 无论是官方还是非官方的解释 最终只有一种答案——ECC算法在jdk 后加入支持 目前仅仅只能完成密钥的生成与解析

  尽管如此 我照旧提供相应的Java实现代码 以供大家参考

  通过java代码实现如下

  import java math BigInteger;import java security Key;import java security KeyFactory;import java security interfaces ECPrivateKey;import java security interfaces ECPublicKey;import java security spec ECFieldF m;import java security spec ECParameterSpec;import java security spec ECPoint;import java security spec ECPrivateKeySpec;import java security spec ECPublicKeySpec;import java security spec EllipticCurve;import java security spec PKCS EncodedKeySpec;import java security spec X EncodedKeySpec;import java util HashMap;import java util Map;

  import javax crypto Cipher;import javax crypto NullCipher;

  import sun security ec ECKeyFactory;import sun security ec ECPrivateKeyImpl;import sun security ec ECPublicKeyImpl;

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

  public static final String ALGORITHM = EC ;    private static final String PUBLIC_KEY = ECCPublicKey ;    private static final String PRIVATE_KEY = ECCPrivateKey ;

  /**     * 解密<br>     * 用私钥解密     *     * @param data     * @param key     * @return     * @throws Exception     */    public static byte[] decrypt(byte[] data String key) throws Exception         // 对密钥解密        byte[] keyBytes = decryptBASE (key);

  // 取得私钥        PKCS EncodedKeySpec pkcs KeySpec = new PKCS EncodedKeySpec(keyBytes);        KeyFactory keyFactory = ECKeyFactory INSTANCE;

  ECPrivateKey priKey = (ECPrivateKey) keyFactory                generatePrivate(pkcs KeySpec);

  ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(priKey getS()                 priKey getParams());

  // 对数据解密        // TODO Chipher不支持EC算法 未能实现        Cipher cipher = new NullCipher();        // Cipher getInstance(ALGORITHM keyFactory getProvider());        cipher init(Cipher DECRYPT_MODE priKey ecPrivateKeySpec getParams());

  return cipher doFinal(data);   

  /**     * 加密<br>     * 用公钥加密     *     * @param data     * @param privateKey     * @return     * @throws Exception     */    public static byte[] encrypt(byte[] data String privateKey)            throws Exception         // 对公钥解密        byte[] keyBytes = decryptBASE (privateKey);

  // 取得公钥        X EncodedKeySpec x KeySpec = new X EncodedKeySpec(keyBytes);        KeyFactory keyFactory = ECKeyFactory INSTANCE;

  ECPublicKey pubKey = (ECPublicKey) keyFactory                generatePublic(x KeySpec);

  ECPublicKeySpec ecPublicKeySpec = new ECPublicKeySpec(pubKey getW()                 pubKey getParams());

  // 对数据加密        // TODO Chipher不支持EC算法 未能实现        Cipher cipher = new NullCipher();        // Cipher getInstance(ALGORITHM keyFactory getProvider());        cipher init(Cipher ENCRYPT_MODE pubKey ecPublicKeySpec getParams());

  return cipher doFinal(data);   

  /**     * 取得私钥     *     * @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());   

  /**     * 初始化密钥     *     * @return     * @throws Exception     */    public static Map<String Object> initKey() throws Exception         BigInteger x = new BigInteger(                fe c bbc acaa d de e d e c eee );        BigInteger x = new BigInteger(                fb d ff f e d ccdaa d );

  ECPoint g = new ECPoint(x x );

  // the order of generator        BigInteger n = new BigInteger(                );        // the cofactor        int h = ;        int m = ;        int[] ks = ;        ECFieldF m ecField = new ECFieldF m(m ks);        // y^ +xy=x^ +x^ +         BigInteger a = new BigInteger( );        BigInteger b = new BigInteger( );

  EllipticCurve ellipticCurve = new EllipticCurve(ecField a b);

  ECParameterSpec ecParameterSpec = new ECParameterSpec(ellipticCurve g                 n h);        // 公钥        ECPublicKey publicKey = new ECPublicKeyImpl(g ecParameterSpec);

  BigInteger s = new BigInteger(                );        // 私钥        ECPrivateKey privateKey = new ECPrivateKeyImpl(s ecParameterSpec);

  Map<String Object> keyMap = new HashMap<String Object>( );

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

  return keyMap;   

  请注意上述代码中的TODO内容 再次提醒注意 Chipher不支持EC算法 以上代码仅供参考 Chipher Signature KeyPairGenerator KeyAgreement SecretKey均不支持EC算法 为了确保程序能够正常执行 我们使用了NullCipher类 验证程序

  照旧提供一个测试类

  import static junit Assert *;

  import java math BigInteger;import java security spec ECFieldF m;import java security spec ECParameterSpec;import java security spec ECPoint;import java security spec ECPrivateKeySpec;import java security spec ECPublicKeySpec;import java security spec EllipticCurve;import java util Map;

  import junit Test;

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

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

  Map<String Object> keyMap = ECCCoder initKey();

  String publicKey = ECCCoder getPublicKey(keyMap);        String privateKey = ECCCoder getPrivateKey(keyMap);        System err println( 公钥: \\n + publicKey);        System err println( 私钥 \\n + privateKey);

  byte[] encodedData = ECCCoder encrypt(data publicKey);

  byte[] decodedData = ECCCoder decrypt(encodedData privateKey);

  String outputStr = new String(decodedData);        System err println( 加密前: + inputStr + \\n\\r + 解密后: + outputStr);        assertEquals(inputStr outputStr);   

    控制台输出

  公钥:MEAwEAYHKoZIzj CAQYFK EEAAEDLAAEAv TwFN vBGsqgfXk ObV clO oAokHD BdOP YMh ugAU TjM qPZ

  私钥 MDICAQAwEAYHKoZIzj CAQYFK EEAAEEGzAZAgEBBBTYJsR BN TFw JHcAHFkwNmfil w==

  加密前: abc

  解密后: abc

cha138/Article/program/Java/gj/201311/27542

相关参考

知识大全 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)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在各种应用系