1. 程式人生 > >Bouncy Castle演算法庫中ECIES演算法呼叫示例

Bouncy Castle演算法庫中ECIES演算法呼叫示例

轉自 :http://blog.sina.com.cn/s/blog_57432f380101s2l7.html

JRE8 + jce_policy-8, Bouncy Castle 1.50環境下除錯通過

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Security;

import javax.crypto.Cipher;
import javax.xml.bind.annotation.adapters.HexBinaryAdapter;

import org.bouncycastle.jce.interfaces.ECPrivateKey;
import org.bouncycastle.jce.interfaces.ECPublicKey;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.math.ec.ECCurve;
import org.bouncycastle.math.ec.ECPoint;

public class TestECC {

 public static void main(String[] args) throws Exception {
  byte[] plainText = "Hello World!".getBytes();
  byte[] cipherText = null;
  
  Security.addProvider(new BouncyCastleProvider());
  //生成公鑰和私鑰
  KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECIES", "BC");
  KeyPair keyPair = keyPairGenerator.generateKeyPair();  
  ECPublicKey ecPublicKey = (ECPublicKey) keyPair.getPublic();
  ECPrivateKey ecPrivateKey = (ECPrivateKey) keyPair.getPrivate();
  //列印金鑰資訊
  ECCurve ecCurve = ecPublicKey.getParameters().getCurve();
  System.out.println("橢圓曲線引數a = " + ecCurve.getA().toBigInteger());
  System.out.println("橢圓曲線引數b = " + ecCurve.getB().toBigInteger());
  System.out.println("橢圓曲線引數q = " + ((ECCurve.Fp) ecCurve).getQ());
  ECPoint basePoint = ecPublicKey.getParameters().getG();
  System.out.println("基點橫座標              "
    + basePoint.getAffineXCoord().toBigInteger());
  System.out.println("基點縱座標              "
    + basePoint.getAffineYCoord().toBigInteger());
  System.out.println("公鑰橫座標              "
    + ecPublicKey.getQ().getAffineXCoord().toBigInteger());
  System.out.println("公鑰縱座標              "
    + ecPublicKey.getQ().getAffineYCoord().toBigInteger());
  System.out.println("私鑰                         " + ecPrivateKey.getD());

  Cipher cipher = Cipher.getInstance("ECIESwithDESede/NONE/PKCS7Padding", "BC");
  // 加密
  cipher.init(Cipher.ENCRYPT_MODE, ecPublicKey);
  cipherText = cipher.doFinal(plainText);
  System.out.println("密文: " + new HexBinaryAdapter().marshal(cipherText));
  // 解密
  cipher.init(Cipher.DECRYPT_MODE, ecPrivateKey);
  plainText = cipher.doFinal(cipherText);
  // 列印解密後的明文
  System.out.println("解密後的明文: " + new String(plainText));
 }
}


相關推薦

Bouncy Castle演算法ECIES演算法呼叫示例

轉自 :http://blog.sina.com.cn/s/blog_57432f380101s2l7.html JRE8 + jce_policy-8, Bouncy Castle 1.50環境下除錯通過 import java.security.KeyPair;

vector 二維陣列的push_back,stl演算法的sort排序,vector insert 用法

1.vector 二維陣列的push_back vector<vector<int> >vec; vector<int>array1; for (int i=0;i<num;i++) {

演算法導論演算法總結

1、插入排序 INSERTION_SORT(A) for j = 2 to A.length key = A[j] i = j-1 while i > 0 and A[i] > key A[i+1] = A[i] i = i-1 A[i+1] =

用Python實現演算法導論演算法

目前正好在學習Python和《演算法導論(原書第三版)》,於是想著想用Python把書中所有演算法實現一遍。更新時間不確定,完成時間我也沒有定下來,大概有空就會寫寫,希望儘早可以完成吧~ 本篇部落格將

Boost演算法——C++11演算法(all_of)

標頭檔案'boost / algorithm / cxx11 / all_of.hpp'包含單個演算法all_of的四個變體。 該演算法測試序列的所有元素,如果它們共享一個屬性,則返回true。 例程all_of需要一個序列和一個謂詞。 如果謂詞在應用於序列中的每個元素時

OpenCVwatershed函式(分水嶺演算法)的詳細使用例程

#include <iostream> #include <opencv2\opencv.hpp> using namespace std; using namespace cv; Mat srcImage, srcImage_, maskImage; Mat maskWaterS

K-means和K-means++的演算法原理及sklearn引數解釋、選擇

前言:   這篇博文主要介紹k-means聚類演算法的基本原理以及它的改進演算法k-means的原理及實現步驟,同時文章給出了sklearn機器學習庫中對k-means函式的使用解釋和引數選擇。 K-means介紹:   K-means演算法是很典型的

SM2演算法第二十七篇: openssl的BIGNUM(超讚)

openssl庫中的BIGNUM,處理大數比較好,可以用在很多方面。 BIGNUM是一個typedef的結構,可以直接使用。但一般來說,使用它的指標結構。如:BIGNUM *p; BIGNUM的建立與釋放 函式原型 解釋 示例 BIGNUM * BN_new (voi

機器學習開源演算法

C++計算機視覺 CCV —基於C語言/提供快取/核心的機器視覺庫,新穎的機器視覺庫 OpenCV—它提供C++, C, Python, Java 以及 MATLAB介面,並支援Windows, Linux, Android and Mac OS作業系統。

[PHP]演算法-二進位制1的個數的PHP實現

二進位制中1的個數: 輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。 思路: 1.右移位運算>> 和 與運算& 2.先移位個然後再與1 &運算為1的就是1 3.這裡如果是負數就會出現死迴圈,負數右移後高位會一直補1 4.因此要實現一下無符號位移 無符

Android演算法

演算法是思想的體現形式,常見的演算法做一些總結 演算法簡介 演算法—Algorithm 解題方案的準確而完整的描述,是一系列解決問題的清晰指令 特徵 有窮性,確切性,輸入項,輸出項,可行性 演算法運算要素 算術運算:加減乘除等運算 邏輯運算:或、且、非等運算 關係運算:大於、小於、等於、不等於等

演算法圖解的二分查詢

對於一種有序的元素列表,很多人的第一反應會是將元素一個一個的進行查詢形成簡單查詢 二分查詢是針對有序元素列表進行的查詢性演算法,舉例說明,如果1-100數字,二分查詢就是對半進行,判斷數字在1-50還是51-100,如果在1-50範圍內,在1-25和26-50進行查詢判斷。 使用python

工作加密演算法實踐

遊戲中需要對接銀聯渠道 對方需求是需要使用非對稱加密演算法 簽名機制: 對於報文的簽名處理機制如下:首先,對報文中出現簽名域(sign)之外的所有資料元採用key=value的形式按照名稱排序,然後以&作為連線符拼接成待簽名串。其次,對待簽名串使用SHA-1演算法做摘要,再使用接入

C++拾取——使用stl標準實現排序演算法及評測

        今天看了一篇文章,講各種語言的優勢和劣勢。其中一個觀點:haskell非常適合寫演算法,因為使用者不用去關心具體的計算機實現,而只要關注於操作語義。這讓它在專心研究演算法的人中非常受歡迎。所以很多時候,語言的爭論沒有太多的意義,有意義的是它

centos7安裝numpy等矩陣演算法

       pip是管理python第三庫的倉庫,類似於管理rpm軟體倉庫的yum伺服器。因此安裝Nump庫、scipy庫、matplotlib庫可以通過先安裝pip管理工具,然後通過pip來安裝第三方庫。 (1)首先安裝pip工具:i) yum -

位數演算法-自己寫的爛碼

import java.util.*; public class Zhongweishufa { public static void main(String args[]){ Scanner in=new Scanner(System.in); while(

skiti-learn邏輯迴歸演算法

skiti-learn中,與邏輯迴歸相關的3個類:LogisticRegression, LogisticRegressionCV,logistic_regression_path。LogisticRegressionCV使用交叉驗證選擇正則化係數C。logistic_regression_

skiti-learn線性迴歸演算法

線性迴歸的目的是要得到輸出向量Y和輸入特徵X之間的線性關係,求出線性迴歸係數θ,也就是 Y=Xθ。其中Y的維度為mx1,X的維度為mxn,而θ的維度為nx1 LinearRegression 最常見的普通線性迴歸,損失函式如下: J(θ)=1/2 (Xθ−Y)T (Xθ−Y)

skiti-learn KNN演算法

skiti-learn中KNN分類樹的類是KNighborsClassifier,KNN迴歸樹的類是KNighborsRegressor.除此之外,限定半徑的最鄰近分類樹RadiusNighborsClassifier,限定半徑的最鄰近迴歸樹RadiusNighborsRegressor,最

skiti-learn決策樹演算法

skiti-learn內部實現的是調優過的CART決策樹。既可以做分類,也可以做迴歸。分類決策樹採用的類是DecisionTreeClassifier,迴歸則是DecisionTreeRegressor。 DecisionTreeClassifier and DecisionTr