2021SC@SDUSC
secp256k1曲線Curve結構定義
- Affine 仿射坐標
開始前先說一下Rust提供的模塊系統,自頂向下依次為:
包(package):一個用于構建、測驗并共享crate的Cargo功能,
單元包(crate):一個用于生成library(庫)或可執行檔案的樹形模塊結構,
模塊(module)、use:控制代碼結構、作用域及路徑的私有路徑,
路徑(path):一種用于命名條目的方法,這些條目包括struct、function和module等,
package與crate
一個package由一個或多個crate組成,一個package帶有一個Cargo.toml描述構筑crate的資訊,crate可以被用作生成二進制程式或庫,
package可以包含:最多一個庫crate(lib);package可以擁有任意多個二進制包;package內至少要有一個crate(庫crate或二進制crate),
下面定義了曲線curve模塊結構,它使用了如下的crate:
/// Curve related structs.
pub mod curve {
pub use crate::{
field::{Field, FieldStorage},
group::{Affine, AffineStorage, Jacobian, AFFINE_G, CURVE_B},
scalar::Scalar,
};
pub use crate::ecmult::{ECMultContext, ECMultGenContext};
}
其中,
Field定義secp256k1的有限域
G
F
(
p
)
GF(p)
GF(p)元素,
FieldStorage實作緊湊的域元素存盤,
Affine,在仿射坐標中定義secp256k1曲線的一組元素,
AffineStorage實作仿射坐標群元緊湊存盤,
Jacobian在雅可比坐標中定義secp256k1曲線的一組元素,
(想要理解在橢圓曲線中的仿射坐標和雅可比坐標相關概念以及為什么要使用它們,請參考我的另一篇博客:橢圓曲線——從仿射坐標到雅可比坐標的轉換,這里不再細說)
AFFINE_G 定義了secp256k1在仿射坐標中的生成元G點,
CURVE_B定義了secp256k1方程引數b(b為常量=7),
Scalar 256位標量值,secp256k1中多處用到標量scalar,其中私鑰和數字簽名中使用的亂數k都是標量,
ECMultContext 加速aP + bG計算的背景關系,
ECMultGenContext 加速aG計算的背景關系,
Affine 仿射坐標
定義仿射坐標下點的結構體,其中x和y值都是Field型變數,還有一個bool型變數infinty表示無窮遠點,
pub struct Affine {
pub x: Field,
pub y: Field,
pub infinity: bool,
}
相關函式實作:
1.創建一個仿射坐標中的點:
pub const fn new(x: Field, y: Field) -> Self {
Self {
x,
y,
infinity: false,
}
}
2.對給定的仿射坐標的x和y值,找到一個在橢圓曲線群中的點:
pub fn set_xy(&mut self, x: &Field, y: &Field) {
self.infinity = false;
self.x = *x;
self.y = *y;
}
3.檢查橢圓曲線群中的點是否滿足橢圓曲線方程:
pub fn is_valid_var(&self) -> bool {
if self.is_infinity() {
return false;
}
let y2 = self.y.sqr();//令y2為對y求平方
let mut x3 = self.x.sqr();
x3 *= &self.x;//x3為對x求立方
let mut c = Field::default();
c.set_int(CURVE_B);//c取secp256k1引數b取值,其中b=7
x3 += &c;//結果x3即為x^3+7,橢圓曲線方程右端
x3.normalize_weak();
y2.eq_var(&x3)//判斷y2與x3是否相等
}
4.對給定的雅可比坐標下的點坐標,找到其在仿射坐標中的對應點:
pub fn set_gej(&mut self, a: &Jacobian) {
self.infinity = a.infinity;
let mut a = *a;
a.z = a.z.inv();
let z2 = a.z.sqr();
let z3 = a.z * z2;
a.x *= z2;
a.y *= z3;
a.z.set_int(1);
self.x = a.x;
self.y = a.y;
}
待更新……
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/336297.html
標籤:區塊鏈
