1. 程式人生 > >橢圓曲線ECC倍點運算forJava

橢圓曲線ECC倍點運算forJava

package com.pathfinder.function;
import java.io.FileInputStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName:  Algorithm   
 * @Description:倍點運算
 * @author: muliming / [email protected]
 * @date:   2017年10月29日 下午6:56:39     
 * @Copyright: 2017
 */
public class Algorithm {
private int a;
private int b;
private int q; 

public Algorithm(int a, int b, int q) {
this.a = a;
this.b = b;
this.q = q;
}

public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
public int getQ() {
return q;
}
public void setQ(int q) {
this.q = q;
}

/**
* @Title: OutsAlgorithm   
* @Description: 倍點運算,給定一個點,進行倍數的計算【具體:把要計算的值,轉為二進位制數,然後在二進位制的每位上做相應的二倍運算,最後再把所有的相加】
* @param: @param    s: 點      n: 需要計算的倍數
* @return: String      
*/
public String OutsAlgorithm(long n,String s)
{
List<Byte> er=new ArrayList<Byte>();//存放轉化為二進位制的數
List<String> dian=new ArrayList<String>();
if(n!=0)
{
//把要計算的值,轉為二進位制數,然後在二進位制的每位上做相應的二倍運算,最後再把所有的相加
while(n!=0)
{
byte i=(byte)(n%2);
er.add(i);
n=n/2;
}
for(int i=0;i<er.size();i++)
{
if(er.get(i)==1)
dian.add(s);
s=multiple2Operation(s);//二倍  倍點運算演算法 計算一個點的n倍的演算法
}
s=dian.get(0);

for(int i=1;i<dian.size();i++)
{
s=addOperation(s, dian.get(i));//計算兩個不同點相加的運算
}
return s;
}
else
{
return "0v0";
}
}


/**
* @Title: multiple2Operation   
* @Description:計算一個點的2倍的值
* @param: @param g:要計算的點
* @return: String   v點的2倍的值  
*/
public String multiple2Operation(String g)
{
int x=2;
String[] vp=g.split("v");
int xp=Integer.parseInt(vp[0]);
int yp=Integer.parseInt(vp[1]);

if(yp==0)
{
return  "0v0"; //TODO y為0的時候怎麼辦?
}
else
{
long Numerator=3*xp*xp+a;//分子
    long denominator=2*yp;//分母
    
    denominator=niyuan(denominator,q,1,0);// 計算分母的逆元
    
    while(denominator<0)
    {
    denominator=denominator+q;
    }

    long ratio=(long)(Numerator*denominator)%q;//計算  入  的值  及斜率

long xrr=(long)(ratio*ratio-2*xp);
while(xrr<0)
{
xrr=xrr+q;
}
int Xr=(int)(xrr%q);//橫座標

long Yrr=(long)(ratio*(xp-Xr)-yp);
while(Yrr<0)
{
Yrr=Yrr+q;
}
int Yr=(int)(Yrr%q);

return Xr+"v"+Yr;//返回2倍點的座標
}
}

/**
* @Title: addOperation   
* @Description: 計算兩個不同點相加的運算
* @param: @param V  點
* @param: @param v1 點
* @return: String    
*/
public String addOperation(String V,String v1)
{
if(v1.equals(V))
{
return multiple2Operation(V);//如果兩個點相等,直接呼叫倍點運算
}
else
{
String[] vp=V.split("v");
String[] vq=v1.split("v");
if(vp[0].equals(vq[0]))//兩個的x值相等
{
return "0v0";
}
else
{
//排錯
if(v1.equals("0v0"))
return V;
else if(V.equals("0v0"))
return v1;
//運算
else
{
//第一個點的x y座標
int xp=Integer.parseInt(vp[0]);
int yp=Integer.parseInt(vp[1]);
//第二個點的x y座標
int xq=Integer.parseInt(vq[0]);
int yq=Integer.parseInt(vq[1]);

long DValueY=(long)yq-yp;//y的差值

while(DValueY<0)
{
DValueY=DValueY+q;
}
long DValueX=(long)xq-xp;//x的差值
while(DValueX<0)
{
DValueX=DValueX+q;
}

DValueX=niyuan(DValueX,q,1,0);
    while(DValueX<0)
    {
    DValueX=DValueX+q;
    }

    long ratio=(long)(DValueY*DValueX)%q;

long xrr=(long)(ratio*ratio-xp-xq);
while(xrr<0)
{
xrr=xrr+q;
}
int xr=(int)(xrr%q);
long yrr=(long)(ratio*(xp-xr)-yp);
while(yrr<0)
{
yrr=yrr+q;
}
int yr=(int)(yrr%q);
//返回值
return xr+"v"+yr;
}
}
}
}

相關推薦

橢圓曲線ECC運算forJava

package com.pathfinder.function; import java.io.FileInputStream; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; /**  * @Cl

橢圓曲線ECC基本概念

橢圓曲線的曲線方程是以下形式的三次方程: y2+axy+by=x3+cx2+dx+e a,b,c,d,e是滿足某些簡單條件的實數。定義中包含一個稱為無窮點的元素,記為O 如果其上的3個點位於同一直

如何給小學生講清楚ECC橢圓曲線加密

對於RSA這套公私鑰加密的思路,我以為我挺明白的,運用的嫻熟自如。 當然現在RSA用的不多,而是基於ECC曲線來做簽名驗籤,最大名鼎鼎的莫過於比特幣。 可是前兩天和別人講程式碼,被問了ECC為什麼可以用來做驗籤,發現自己講不清楚。 所以做了點功課,來把這個問題講清楚。 首先我們跳過ECC曲線是個啥這個話題,這

ECC橢圓曲線加密演算法

橢圓曲線加密也是一種公鑰加密演算法,和RSA與離散對數一樣,它也是基於一個數學求解的難題,並且它的難度比RSA和離散對數都要大,它基於的數字難題就是求取定義在橢圓曲線上的離散對數的求取難題,對於這個難題的描述比大數分解和離散對數要稍微複雜一些,不過它也還算比較形

簡單橢圓曲線加密演算法(ECC)示例(MATLAB實現)

摘要 本文主要是使用MATLAB演示橢圓曲線加密演算法(ECC)的加密/解密過程,內容包括金鑰、公鑰生成,以及通過加密並解密一個簡單數字的過程來描述其使用方法。 本文實際是對以下兩篇文章的一個MATLAB實現,並且提供了兩個實用的MATLAB工具函式以便在閱

ECC橢圓曲線、ECDSA簽名驗籤和ECIES加解密

ECC橢圓曲線詳解前言ECC英文全稱"Ellipse Curve Cryptography",與傳統的基於大質數因子分解困難性的加密方法不同,ECC通過橢圓曲線方程式的性質產生金鑰ECC164位的金鑰產生一個安全級,相當於RSA 1024位金鑰提供的保密強度,而且計算量較小,

什麼是橢圓曲線加密(ECC)?

轉載自http://8btc.com/article-138-1.html,一次沒看明白記錄下來多看幾次。 比特幣使用橢圓曲線演算法生成公鑰和私鑰,選擇的是secp256k1曲線。與RSA(Ron Rivest,Adi Shamir,Len Adleman三位

現代應用密碼學中橢圓曲線集E以及乘演算法的java程式碼實現

【問題】: (1)生成橢圓曲線有限域上的點集。給定p=211,a=0,b=-4 (2) 給定生成元G(2,2)找出其他點與生成元之間的關係。 【解答】:面多較大的有限域p,依靠手動計算以及不符合實際,因此我在理解橢圓曲線數學原理和點乘演算法的基礎上,用java程式編寫完

使用BouncyCastle求ECC上的K

例如,計算基點G的k倍點即求(x1,y1)=[k]G java程式碼如下: ECPoint Q = (new FixedPointCombMultiplier()).multiply(G, k); Q = Q.normalize(); ECFieldElem

關於密碼中的RSA演算法和ecc(橢圓曲線)演算法加密過程是怎樣的?

作者:Kalafinaian 連結:https://www.zhihu.com/question/26662683/answer/325511510 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。   Oblivious 何処へ行くの

【數字圖像處理】五.MFC圖像運算之灰度線性變化、灰度非線性變化、閾值化和均衡化處理具體解釋

tput rgb 強制轉換 spa ros 例如 read 算法 nload 本文主要講述基於VC++6.0 MFC圖像處理的應用知識,主要結合自己大三所學課程《數字圖像處理》及課件進行解說。主要通過MFC單文檔視圖實現顯示BMP圖片

SM2橢圓曲線公鑰密碼算法

left lock 沃通ca width 數據 是什麽 理論 我們 實現 國家必須要有屬於自己的一套加密機制才行。。。好復雜。分享下看哪位看得懂其中的原理 國家密碼管理局於2010年12月17日發布了SM2橢圓曲線公鑰密碼算法,並要求為對現有基於RSA算法的電子

ES6---擴展運算符和rest‘...’(三運算符),在數組、函數、set/map等中的應用

數組集合 發揮 通過 一起 數量 ... XML 參數 運算符和 ES6新增的三點運算符,是由三個點表示,在數組中扮演著重要的角色,可以對數組進行合並與分解、可以對set等數據結構進行轉換、可以對函數參數進行簡化表示,接下來,我們一起揭開其神秘面紗… ●三點—r

匯編,浮運算符,fldpi,fmul等指令說明.

位數 進位 定義 分別是 而在 跳轉 pat 集中 訪問內存 協處理器指令系統 協處理器共有68條不同的指令,匯編程序在遇到協處理器指令助記符時,都會將其轉換成機器語言的ESC指令,ESC指令代表了協處理器的操作碼。 協處理器指令在執行過程中,需要訪問內存單元時,CPU

Nodejs學習筆記(十七)—浮運算decimal.js

學習筆記 存儲 log title ron 學習 decimal 安裝 bit 前言   開發過程中免不了有浮點運算,JavaScript浮點運算的精度問題會帶來一些困擾   JavaScript 只有一種數字類型 ( Number )    JavaScript采用

橢圓曲線質因數分解2

namespace lar get bre factor break failure long long dds #include <cstring> #include <cstdio> #include <cmath> #include

ES6擴展運算符(三運算符)...的用法

zha 擴展運算 object let ole ngs cit 操作 pre 1. 第一個叫做 展開運算符(spread operator),作用是和字面意思一樣,就是把東西展開。可以用在array和object上都行。 let a = [1,2,3]; let b =

Objective-C中,類方法的getter和setter可以用運算符嗎?

clang col 靜態變量 變量 uri family lan getc sta Objective-C中,對象實例property的getter和setter可以使用點運算符來操作,那麽類方法的getter和setter可以使用點運算嗎? 答案是肯定的。 看如下代碼

3運算

參數 nbsp value nts for 點運算 擴展運算 sum 用途 1、用途   rest(可變)參數   用來取代arguments 但比arguments靈活,只能是最後部分形參參數 function add(...values) { let sum

運算: 基於直方圖的對比度增強

點運算: 基於直方圖的對比度增強 引言 1、影象顯示與儲存原理 - RGB - CMY(K) - HSV - CIE-XYZ 儲存原理 2、影象增強的目標