欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于java實(shí)現(xiàn)的ECC加密算法示例

 更新時(shí)間:2017年08月11日 12:15:25   作者:wjq008  
這篇文章主要介紹了基于java實(shí)現(xiàn)的ECC加密算法,簡單說明了ECC算法的概念、原理,并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)ECC加密算法的定義與使用技巧,需要的朋友可以參考下

本文實(shí)例講述了基于java實(shí)現(xiàn)的ECC加密算法。分享給大家供大家參考,具體如下:

ECC

ECC-Elliptic Curves Cryptography,橢圓曲線密碼編碼學(xué),是目前已知的公鑰體制中,對每比特所提供加密強(qiáng)度最高的一種體制。在軟件注冊保護(hù)方面起到很大的作用,一般的序列號通常由該算法產(chǎn)生。

當(dāng)我開始整理《Java加密技術(shù)(二)》的時(shí)候,我就已經(jīng)在開始研究ECC了,但是關(guān)于Java實(shí)現(xiàn)ECC算法的資料實(shí)在是太少了,無論是國內(nèi)還是國外的 資料,無論是官方還是非官方的解釋,最終只有一種答案——ECC算法在jdk1.5后加入支持,目前僅僅只能完成密鑰的生成與解析。 如果想要獲得ECC算法實(shí)現(xiàn),需要調(diào)用硬件完成加密/解密(ECC算法相當(dāng)耗費(fèi)資源,如果單純使用CPU進(jìn)行加密/解密,效率低下),涉及到Java Card領(lǐng)域,PKCS#11。 其實(shí),PKCS#11配置很簡單,但缺乏硬件設(shè)備,無法嘗試!

盡管如此,我照舊提供相應(yīng)的Java實(shí)現(xiàn)代碼,以供大家參考。

通過java代碼實(shí)現(xiàn)如下:

Coder類:

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.ECFieldF2m;
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.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
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 1.0
 * @since 1.0
 */
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 = decryptBASE64(key);
    // 取得私鑰
    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = ECKeyFactory.INSTANCE;
    ECPrivateKey priKey = (ECPrivateKey) keyFactory
        .generatePrivate(pkcs8KeySpec);
    ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(priKey.getS(),
        priKey.getParams());
    // 對數(shù)據(jù)解密
    // TODO Chipher不支持EC算法 未能實(shí)現(xiàn)
    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 = decryptBASE64(privateKey);
    // 取得公鑰
    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = ECKeyFactory.INSTANCE;
    ECPublicKey pubKey = (ECPublicKey) keyFactory
        .generatePublic(x509KeySpec);
    ECPublicKeySpec ecPublicKeySpec = new ECPublicKeySpec(pubKey.getW(),
        pubKey.getParams());
    // 對數(shù)據(jù)加密
    // TODO Chipher不支持EC算法 未能實(shí)現(xiàn)
    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 encryptBASE64(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 encryptBASE64(key.getEncoded());
  }
  /**
   * 初始化密鑰
   * 
   * @return
   * @throws Exception
   */
  public static Map<String, Object> initKey() throws Exception {
    BigInteger x1 = new BigInteger(
        "2fe13c0537bbc11acaa07d793de4e6d5e5c94eee8", 16);
    BigInteger x2 = new BigInteger(
        "289070fb05d38ff58321f2e800536d538ccdaa3d9", 16);
    ECPoint g = new ECPoint(x1, x2);
    // the order of generator
    BigInteger n = new BigInteger(
        "5846006549323611672814741753598448348329118574063", 10);
    // the cofactor
    int h = 2;
    int m = 163;
    int[] ks = { 7, 6, 3 };
    ECFieldF2m ecField = new ECFieldF2m(m, ks);
    // y^2+xy=x^3+x^2+1
    BigInteger a = new BigInteger("1", 2);
    BigInteger b = new BigInteger("1", 2);
    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(
        "1234006549323611672814741753598448348329118574063", 10);
    // 私鑰
    ECPrivateKey privateKey = new ECPrivateKeyImpl(s, ecParameterSpec);
    Map<String, Object> keyMap = new HashMap<String, Object>(2);
    keyMap.put(PUBLIC_KEY, publicKey);
    keyMap.put(PRIVATE_KEY, privateKey);
    return keyMap;
  }
}

請注意上述代碼中的TODO內(nèi)容,再次提醒注意,Chipher不支持EC算法 ,以上代碼僅供參考。Chipher、Signature、KeyPairGenerator、KeyAgreement、SecretKey均不支持EC算法。為了確保程序能夠正常執(zhí)行,我們使用了NullCipher類,驗(yàn)證程序。

照舊提供一個(gè)測試類:

import static org.junit.Assert.*;
import java.math.BigInteger;
import java.security.spec.ECFieldF2m;
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 org.junit.Test;
/**
 * 
 * @author 梁棟
 * @version 1.0
 * @since 1.0
 */
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);
  }
}

控制臺輸出:

公鑰: 
MEAwEAYHKoZIzj0CAQYFK4EEAAEDLAAEAv4TwFN7vBGsqgfXk95ObV5clO7oAokHD7BdOP9YMh8u
gAU21TjM2qPZ
私鑰: 
MDICAQAwEAYHKoZIzj0CAQYFK4EEAAEEGzAZAgEBBBTYJsR3BN7TFw7JHcAHFkwNmfil7w==
加密前: abc
解密后: abc

本篇的主要內(nèi)容為Java證書體系的實(shí)現(xiàn)。

PS:關(guān)于加密解密感興趣的朋友還可以參考本站在線工具:

文字在線加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_encode

MD5在線加密工具:
http://tools.jb51.net/password/CreateMD5Password

在線散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt

在線MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha

在線sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode

更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java字符與字符串操作技巧總結(jié)》、《java日期與時(shí)間操作技巧匯總》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • RabbitMQ下載與安裝教程

    RabbitMQ下載與安裝教程

    RabbitMQ是實(shí)現(xiàn)了高級消息隊(duì)列協(xié)議(AMQP)的開源消息代理軟件(亦稱面向消息的中間件),這篇文章給大家介紹RabbitMQ下載與安裝教程,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • 一次Jvm old過高的排查過程實(shí)戰(zhàn)記錄

    一次Jvm old過高的排查過程實(shí)戰(zhàn)記錄

    這篇文章主要給大家介紹了一次Jvm old過高的排查過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Spring啟動(dòng)指定時(shí)區(qū)的兩種方法

    Spring啟動(dòng)指定時(shí)區(qū)的兩種方法

    最近項(xiàng)目啟動(dòng),時(shí)間要修改成東七區(qū)時(shí)間,本文主要介紹了Spring啟動(dòng)指定時(shí)區(qū)的兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • MyBatis的@SelectProvider注解構(gòu)建動(dòng)態(tài)SQL方式

    MyBatis的@SelectProvider注解構(gòu)建動(dòng)態(tài)SQL方式

    這篇文章主要介紹了MyBatis的@SelectProvider注解構(gòu)建動(dòng)態(tài)SQL方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • MyBatis中XML 映射文件中常見的標(biāo)簽說明

    MyBatis中XML 映射文件中常見的標(biāo)簽說明

    這篇文章主要介紹了MyBatis中XML 映射文件中常見的標(biāo)簽說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java并發(fā)編程之常用的輔助類詳解

    Java并發(fā)編程之常用的輔助類詳解

    這篇文章主要給大家介紹了關(guān)于Java并發(fā)編程之常用的輔助類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 圖文詳解Java中的字節(jié)輸入與輸出流

    圖文詳解Java中的字節(jié)輸入與輸出流

    在Java中所有數(shù)據(jù)都是使用流讀寫的,流是一組有序的數(shù)據(jù)序列,將數(shù)據(jù)從一個(gè)地方帶到另一個(gè)地方,這篇文章主要給大家介紹了關(guān)于Java中字節(jié)輸入與輸出流的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式

    Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式

    這篇文章主要介紹了Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式,對設(shè)計(jì)模式感興趣的同學(xué),一定要看一下
    2021-04-04
  • springboot實(shí)現(xiàn)文件上傳步驟解析

    springboot實(shí)現(xiàn)文件上傳步驟解析

    這篇文章主要介紹了springboot實(shí)現(xiàn)文件上傳步驟解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 基于springboot攔截器HandlerInterceptor的注入問題

    基于springboot攔截器HandlerInterceptor的注入問題

    這篇文章主要介紹了springboot攔截器HandlerInterceptor的注入問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論