椭圆曲线加密算法代码 用什么有限域

1427人阅读
椭圆曲线算法
椭圆曲线密码体制来源于对椭圆曲线的研究,所谓椭圆曲线指的是由韦尔斯特拉斯(Weierstrass)方程:
y2+a1xy+a3y=x3+a2x2+a4x+a6 (1)
所确定的平面曲线。其中系数ai(I=1,2,…,6)定义在某个域上,可以是有理数域、实数域、复数域,还可以是有限域GF(pr),椭圆曲线密码体制中用到的椭圆曲线都是定义在有限域上的。
椭圆曲线上所有的点外加一个叫做无穷远点的特殊点构成的集合连同一个定义的加法运算构成一个Abel群。在等式
mP=P+P+…+P=Q (2)
中,已知m和点P求点Q比较容易,反之已知点Q和点P求m却是相当困难的,这个问题称为椭圆曲线上点群的离散对数问题。椭圆曲线密码体制正是利用这个困难问题设计而来。
公钥算法是基于数学函数(如单向陷门函数),公钥密码体制根据其所依据的难题一般分为三类:大整数分解问题类、离散对数问题类、椭圆曲线类。
本文是在素域Zp上的,以Menezes-Vanstone形式的椭圆加密算法。
在素域上的曲线函数为
y^2 = x ^ 3 +a* &x + b & & &a,b为小于p的非负数,且 4*a^3+ 27*b^2 != 0
对于在素域上的加法中,对于所有的点P,Q 属于E(Zp),有加法规则:
1。P + O = O + P = P ,P + (-P) = O;
O为椭圆曲线上的零点或者称为无限远的点,但是O在椭圆曲线的加法域上。
2.加法的分配率和结合律,对于s,t 属于Zp,有(s + t )* P = s * P + t* P;
3.对于 P = (x1,y1),Q = (x2,y2) ,并且 P != - Q,则P + Q=(x3,y3),
x3 = k^2 - x1 -x2;
y3 = k*(x1-x3) - y1;
k = (y2-y1)/(x2-x1) & if P != Q;
k = (3x1^2 + a)/(2*y1) if P == Q;
椭圆曲线在素域上的运算用到除法,而在除法的规则是a / b = c mod p 即计算 a x b^-1 = c mod p ,其中 b^-1为b的乘法逆元, 即 b x b^-1 = 1 mod p。对于乘法逆元,当b与p互素时,存在唯一解,而这里p是一个素数,且b不可能为1,则肯定有解。对于求乘法逆元,一般使用欧几里德算法,如下:
int getX_1(int x,int mod){
int Q,X1,X2,X3,Y1,Y2,Y3,T1,T2,T3;
Y3 = (x%mod + mod) %//获得正整数
while(Y3 != 1){
Q = X3 / Y3;
T1 = X1 - Q * Y1;
T2 = X2 - Q * Y2;
T3 = X3 - Q * Y3;
return Y2;
乘法运算规则:
1. 对于任意 k 属于 Zp,有 k * P = P + ..... + P (k个P相加)
2. 对于任意 s,t 属于 Zp,有 s *(t *P) = (s*t)*P
对于Menezes-Vanstone的椭圆加密算法:
1. 产生密钥,
任选一个整数k ,0&k&p ,为私钥,在曲线上任选一点 A ,并计算 B = k*A ,公钥为(A,,B)。其中又可称A为基钥,对于最小整数n以使 n* A = O ,则n称为周期,要是周期为素数,且为一个较大值才合理。
2.加密过程:
令明文为 M = (m1,m2),M可以不是曲线E上的点。计算得到密文(C1,C2),其中任选一个数属于Zp:
C1 = r * A;;
Y= (y1,y2) = r * B;
C2 = (C21,C22) = (y1 * m1 mod p,y2* m2 mod p)
3 解密过程;
计算Z = (z1,z2) = k*C1;计算明文 M = (C21 * z1^-1 mod p, C22 * z2 ^ -1 mod p).
c++中的模运算,当有负数存在时无法达到正确结果,简直是坑,如 -1 % 2,在使用vs2012进行测试,会返回-1,而不是1. c++中模运算结果的符号和被除数的符号一致。
参数选取:选取 p = 127,曲线函数为: y^2 = x^3 + 5* x + 37, a = 5 ,b= 37, r = 7.选取私钥 k = 9选取一个点A为(11,4)则 B = k*A = (120,41)
则源代码如下,这里直接对char进行加密,效果不佳
#include &stdafx.h&
#include &string&
#include &iostream&
const int k = 9;
const int a = 5;
const int b = 37;
const int p = 127;
const int r =7;
int getX_1(int x,int mod){
int Q,X1,X2,X3,Y1,Y2,Y3,T1,T2,T3;
Y3 = (x%mod + mod) %//获得正整数
while(Y3 != 1){
Q = X3 / Y3;
T1 = X1 - Q * Y1;
T2 = X2 - Q * Y2;
T3 = X3 - Q * Y3;
return Y2;
}//获得其乘法逆元
struct point{
point A,B;//公钥
typedef pair&point,point&
bool operator == (point pa,point pb){
return pa.x == pb.x && pa.y == pb.y;
point operator + (point pa , point pb){
if(pa == pb)
k = ((3 * pa.x * pa.x + a) * getX_1(2* pa.y ,p)) %//必须使用正整数。这里pa.y的值不能取0.
//当取0时,这就不能进行这个计算了,因为 pa = -pb了,则,应该进行一个判断。但是,这样的结果是 O,是不在椭圆曲线上的,不能进行输出的值。
//这里是有一个周期数在,对于容易一个基值的也就是先给出的A来说,它有一个周期n,使nA = O,而这里所有参数的选取值
//都小于n,使其不会达到O,保证了不会出错,应该是这样吧。。。
k = (pb.y - pa.y) * getX_1(pb.x - pa.x , p) %p;
c.x = (k*k - pa.x -pb.x) %p;
c.y = (k * (pa.x - c.x) - pa.y)%
c.x = (c.x + p) %p;
c.y = (c.y + p) %p;
point operator * (point &b,int n){
for(int i = 1 ; i &i++){
twopoint ECodePoint(point m){
point c1,c2;
point Y = B *
c2.x = Y.x * m.x %
c2.y = Y.y * m.y %
return twopoint(c1,c2);
point DCodePoint(twopoint t){
point Z = t.first *
m.x = t.second.x * getX_1(Z.x,p) %
m.y = t.second.y * getX_1(Z.y,p) %
string ECode(string input){//明文的输入是一个string类型,但是单个的操作应该是对单个的字符char转换成的int类型进行计算
string output = &&;
twopoint C;
for(int i =0; i & input.length();i++){
M.y = input[i];
C = ECodePoint(M);
output += (char)C.first.
output += (char)C.first.
output += (char)C.second.
output += (char)C.second.
string DCode(string input){
string output = &&;
twopoint C;
if(input.length()%4 != 0)
return &错误输入&;//因为密文肯定是4的倍数,如果不是,肯定出错了。
for(int i = 0;i & input.length();){
C.first.x = input[i++];
C.first.y = input[i++];
C.second.x = input[i++];
C.second.y = input[i++];
M = DCodePoint(C);
output += (char)M.y;
int main()
string s = &&;
//加密简单,随便输入点东西就可以加密了,但是解密不行啊,随便输入肯定是错误的结果,
//程序肯定会出错,所以,只支持对之前加密的结果进行解密。
cout&&&使用在素域上的曲线 y^2 = x^3 + 5*x +37
,使用Menezes-Vanstone的算法:&&&
cout&&&在素域p=127上,私钥为k=9,公钥A(11,4),B(120,41),对明文字符串直接转换为int进行加密&&&
cout&&&请输入要加密的内容:&&&
cout&&&密文如下:&&&&\r\n&;
s = ECode(s);
cout&&&对之前密文解密,得到明文如下(由于输入密文不正确绝对会使这个程序出错,所以只能解密绝对安全的密文):&&&&\r\n&;
s = DCode(s);
cout&&s&&&\r\n&&&&完成&&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:100282次
积分:2615
积分:2615
排名:第11329名
原创:154篇
评论:10条
文章:15篇
阅读:9280
(2)(1)(3)(3)(38)(42)(23)(42)有限域上乘法群离散对数问题的计算复杂性是密码学研究的重要问题之一。有限素数域Fq上乘法群离散对数问题已知最快的计算方法是NFS方法,其计算复杂性为亚指数时间:有限扩域Fqk(k&1)上乘法群离散对数在Joux于2013年发表一系列重要工作后,最近几年取得了重大的进展。具体地讲:对于小特征有限域上的离散对数问题,已经可以构造拟多项式时间的启发式算法来求解。2015年后对中等大小和大素数q的有限扩域Fqk,根据q和k的特征不同,研究人员构造出不同计算复杂度的新算法。新算法的复杂性仍然是亚指数时间,但是渐进复杂性比以前的算法有所减少。
基于椭圆曲线双线性对的密码算法需使用双线性对友好的椭圆曲线实现高效的双线性对运算进而构造高效实用的密码算法。由于双线性对的存在,可以利用MOV方法将双线性对使用的两个输入群G1或G2上的椭圆曲线离散问题转换为输出群GT上的离散对数问题,即有限域Fqk上乘法群中的离散对数问题。所以有限域上乘法群离散对数问题的进展对基于椭圆曲线双线性对的密码算法有一定影响。具体地讲:Joux等的工作使得特征为2或者3的超奇异曲线不再适合于构造安全的双线性对密码算法系统。对采用如BN曲线、Freeman曲线、BLS12曲线、KSS曲线、BLS24曲线等构造的密码系统,我们可能需要适当调整素域Fq的大小以达到相应的安全级别。最新的报告http://eprint.iacr.org/.pdf详细总结了最近几年该领域的进展,特别是针对128和192位安全级别上相关算法的实际复杂性进行了系统的评估。该报告显示如果考虑最近提出的新算法涉及的所有开销,现在推荐使用的曲线参数的安全性并没有受到影响,如BN-256曲线仍然可以到达128位安全级别,BLS24-480曲线依然可以到达192位安全级别。
可以看到经过学术界多年广泛和深入的研究,目前没有发现明显影响双线性对密码系统应用的安全性风险。虽然有些双线对友好曲线因为其数学结构特殊导致其上的离散对数问题复杂性受到学术研究进步的显著影响,但是我们只需要规避使用这类曲线即可。经典椭圆曲线密码在发展过程中也碰到类似的问题。另外正如Chatterjee,Menezes等指出的,扩域Fqk上离散问题的进展可能用于基域Fq上离散对数问题的求解,特别是如果在Fq2上离散对数问题的复杂性小于,那么将产生一个在Fq上比目前最快离散对数算法更加高效的算法,而这样的算法在过去20年一直都没有找到。只要有限域上乘法群离散对数问题的计算复杂性仍然维持在亚指数时间,我们总是可以通过适当增加素域Fq的大小来实现指定的安全级别。在满足安全性需求的情况下,当前CPU的计算能力足以快速实现双线性对的计算,进而使得我们可以构造高效实用的密码系统。
更多深圳奥联关于基于椭圆曲线双线性对的密码算法安全性的建议可详见。该文件包括深圳奥联信息安全技术有限公司在综合考虑该领域学术进展、工程实现等因素后推荐使用的曲线参数以及其上的性能评估。对比该文件和可以看到我们推荐选择的曲线参数比Alfred Menezes等推荐的最保守的曲线参数的安全性还要高。在这些曲线上,我们通过大量的算法优化工作实现了高安全、高效率的基于椭圆曲线双线性对的密码系统。c++ 简单的实现椭圆曲线加密算法 - 推酷
c++ 简单的实现椭圆曲线加密算法
椭圆曲线算法
椭圆曲线密码体制来源于对椭圆曲线的研究,所谓椭圆曲线指的是由韦尔斯特拉斯(Weierstrass)方程:
y2+a1xy+a3y=x3+a2x2+a4x+a6 (1)
所确定的平面曲线。其中系数ai(I=1,2,…,6)定义在某个域上,可以是有理数域、实数域、复数域,还可以是有限域GF(pr),椭圆曲线密码体制中用到的椭圆曲线都是定义在有限域上的。
椭圆曲线上所有的点外加一个叫做无穷远点的特殊点构成的集合连同一个定义的加法运算构成一个Abel群。在等式
mP=P+P+…+P=Q (2)
中,已知m和点P求点Q比较容易,反之已知点Q和点P求m却是相当困难的,这个问题称为椭圆曲线上点群的离散对数问题。椭圆曲线密码体制正是利用这个困难问题设计而来。
公钥算法是基于数学函数(如单向陷门函数),公钥密码体制根据其所依据的难题一般分为三类:大整数分解问题类、离散对数问题类、椭圆曲线类。
本文是在素域Zp上的,以Menezes-Vanstone形式的椭圆加密算法。
在素域上的曲线函数为
y^2 = x ^ 3 +a* &x + b & & &a,b为小于p的非负数,且 4*a^3+ 27*b^2 != 0
对于在素域上的加法中,对于所有的点P,Q 属于E(Zp),有加法规则:
1。P + O = O + P = P ,P + (-P) = O;
O为椭圆曲线上的零点或者称为无限远的点,但是O在椭圆曲线的加法域上。
2.加法的分配率和结合律,对于s,t 属于Zp,有(s + t )* P = s * P + t* P;
3.对于 P = (x1,y1),Q = (x2,y2) ,并且 P != - Q,则P + Q=(x3,y3),
k = (y2-y1)/(x2-x1) & if P != Q;
k = (3x1^2 + a)/(2*y1) if P == Q;
椭圆曲线在素域上的运算用到除法,而在除法的规则是a / b = c mod p 即计算 a x b^-1 = c mod p ,其中 b^-1为b的乘法逆元, 即 b x b^-1 = 1 mod p。对于乘法逆元,当b与p互素时,存在唯一解,而这里p是一个素数,且b不可能为1,则肯定有解。对于求乘法逆元,一般使用欧几里德算法,如下:
int getX_1(int x,int mod){
int Q,X1,X2,X3,Y1,Y2,Y3,T1,T2,T3;
Y3 = (x%mod + mod) %//获得正整数
while(Y3 != 1){
Q = X3 / Y3;
T1 = X1 - Q * Y1;
T2 = X2 - Q * Y2;
T3 = X3 - Q * Y3;
return Y2;
乘法运算规则:
1. 对于任意 k 属于 Zp,有 k * P = P + ..... + P (k个P相加)
2.&对于任意 s,t 属于 Zp,有 s *(t *P) = (s*t)*P
对于Menezes-Vanstone的椭圆加密算法:
1. 产生密钥,
&任选一个整数k &,0&k&p ,为私钥,在曲线上任选一点 A ,并计算 B = k*A ,公钥为(A,,B)。其中又可称A为基钥,对于最小整数n以使 n* A = O ,则n称为周期,要是周期为素数,且为一个较大值才合理。
2.加密过程:
令明文为 M = (m1,m2),M可以不是曲线E上的点。计算得到密文(C1,C2),其中任选一个数属于Zp:
C1 = r * A;;
Y= (y1,y2) = r * B;
C2 = (C21,C22) = (y1 * m1 mod p,y2* m2 mod p)
3 解密过程;
计算Z = (z1,z2) = k*C1;计算明文 M = (C21 * z1^-1 mod p, C22 * z2 ^ -1 mod p).
c++中的模运算,当有负数存在时无法达到正确结果,简直是坑,如 -1 % 2,在使用vs2012进行测试,会返回-1,而不是1. c++中模运算结果的符号和被除数的符号一致。
参数选取:选取 p = 127,曲线函数为: & y^2 = x^3 + & 5* x + 37, a = 5 ,b= 37, r = 7.选取私钥 k = 9选取一个点A为(11,4)则 B = k*A = (120,41)
则源代码如下,这里直接对char进行加密,效果不佳
#include &stdafx.h&
#include &string&
#include &iostream&
const int k = 9;
const int a = 5;
const int b = 37;
const int p = 127;
const int r =7;
int getX_1(int x,int mod){
int Q,X1,X2,X3,Y1,Y2,Y3,T1,T2,T3;
Y3 = (x%mod + mod) %//获得正整数
while(Y3 != 1){
Q = X3 / Y3;
T1 = X1 - Q * Y1;
T2 = X2 - Q * Y2;
T3 = X3 - Q * Y3;
return Y2;
}//获得其乘法逆元
struct point{
point A,B;//公钥
typedef pair&point,point&
bool operator == (point pa,point pb){
return pa.x == pb.x && pa.y == pb.y;
point operator + (point pa , point pb){
if(pa == pb)
k = ((3 * pa.x * pa.x + a) * getX_1(2* pa.y ,p)) %//必须使用正整数。这里pa.y的值不能取0.
//当取0时,这就不能进行这个计算了,因为 pa = -pb了,则,应该进行一个判断。但是,这样的结果是 O,是不在椭圆曲线上的,不能进行输出的值。
//这里是有一个周期数在,对于容易一个基值的也就是先给出的A来说,它有一个周期n,使nA = O,而这里所有参数的选取值
//都小于n,使其不会达到O,保证了不会出错,应该是这样吧。。。
k = (pb.y - pa.y) * getX_1(pb.x - pa.x , p) %p;
c.x = (k*k - pa.x -pb.x) %p;
c.y = (k * (pa.x - c.x) - pa.y)%
c.x = (c.x + p) %p;
c.y = (c.y + p) %p;
point operator * (point &b,int n){
for(int i = 1 ; i &i++){
twopoint ECodePoint(point m){
point c1,c2;
point Y = B *
c2.x = Y.x * m.x %
c2.y = Y.y * m.y %
return twopoint(c1,c2);
point DCodePoint(twopoint t){
point Z = t.first *
m.x = t.second.x * getX_1(Z.x,p) %
m.y = t.second.y * getX_1(Z.y,p) %
string ECode(string input){//明文的输入是一个string类型,但是单个的操作应该是对单个的字符char转换成的int类型进行计算
string output = &&;
twopoint C;
for(int i =0; i & input.length();i++){
M.y = input[i];
C = ECodePoint(M);
output += (char)C.first.
output += (char)C.first.
output += (char)C.second.
output += (char)C.second.
string DCode(string input){
string output = &&;
twopoint C;
if(input.length()%4 != 0)
return &错误输入&;//因为密文肯定是4的倍数,如果不是,肯定出错了。
for(int i = 0;i & input.length();){
C.first.x = input[i++];
C.first.y = input[i++];
C.second.x = input[i++];
C.second.y = input[i++];
M = DCodePoint(C);
output += (char)M.y;
int main()
string s = &&;
//加密简单,随便输入点东西就可以加密了,但是解密不行啊,随便输入肯定是错误的结果,
//程序肯定会出错,所以,只支持对之前加密的结果进行解密。
cout&&&使用在素域上的曲线 y^2 = x^3 + 5*x +37
,使用Menezes-Vanstone的算法:&&&
cout&&&在素域p=127上,私钥为k=9,公钥A(11,4),B(120,41),对明文字符串直接转换为int进行加密&&&
cout&&&请输入要加密的内容:&&&
cout&&&密文如下:&&&&\r\n&;
s = ECode(s);
cout&&&对之前密文解密,得到明文如下(由于输入密文不正确绝对会使这个程序出错,所以只能解密绝对安全的密文):&&&&\r\n&;
s = DCode(s);
cout&&s&&&\r\n&&&&完成&&&
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致本文标签:, , ,
您可能还会对这些文章感兴趣!椭圆曲线加密法_百度百科
椭圆曲线加密法
本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来吧!
椭圆曲线加密法(ECC)是一种公钥加密技术,以椭圆曲线理论为基础,在创建密钥时可做到更快、更小,并且更有效。ECC 利用椭圆曲线等式的性质来产生密钥,而不是采用传统的方法利用大质数的积来产生。
椭圆曲线加密法概述
椭圆曲线加密法ECC(EllipticCurveCryptography)是一种公钥加密技术,以椭圆曲线理论为基础,利用有限域上椭圆曲线的点构成的Abel群离散对数难解性,实现加密、解密和数字签名,将椭圆曲线中的加法运算与离散对数中的模乘运算相对应,就可以建立基于椭圆曲线的对应密码体制。椭圆曲线是由下列韦尔斯特拉斯Weierstrass方程所确定的平面曲线:
E:y2+a1xy+a3y=x3+a2x2+a4x+a6
在数学上,对椭圆曲线的性质和功能的研究已经有150年了。但是它们在加密技术上的应用是在1985年由华盛顿大学的Neal Koblitz和IBM的Victor Miller首次提出的。椭圆曲线不是一个椭圆(椭圆形状),而是由交叉两个轴线(在一个图中用来说明点的位置的线)的环线表示。ECC基于一个数组产生的特定种类的方程式的性质,数组是由直线与轴线交叉的点组成的。用曲线上的点乘以一个数可以产生曲线上的另一个点,但是即使你知道原来的数和结果,你也很难找到乘的那个数。基于椭圆曲线的方程式有一个对加密技术来说非常有价值的性质:相对来说,方程式比较容易执行,但是反过来却非常困难。[1]
椭圆曲线加密法特点
椭圆曲线加密算法以其密钥长度小、安全性能高、整个数字签名耗时小,使其在智能终端应用中有很大的发展潜力,比如掌上电脑、移动手机等都能有更好的表现。而在网络中,ECC算法也保证了其协同工作的实时性,使用ECC算法加密敏感性级别较高的数据(如密钥),速度上能够满足大数据量要求,而且安全性高,能很好地保障系统的安全。
由于椭圆曲线密码体制的安全性只与椭圆曲线的安全性有关,而椭圆曲线安全性是由ECDLP求解的困难性决定的,因此,为了保证ECDLP是难解的,在选取椭圆曲线的时候除了选择合适的参数(a,b),使得相应的Weierstrass方程满足非超奇异椭圆曲线的要求外,还要选取合适的有限域GF(q),使得q满足#E能被一大素数(≥30位的整数)整除,或q本身就是一个大素数。安全的椭圆曲线也就是能抵抗各种已有攻击算法攻击的椭圆曲线。
在数学上,对椭圆曲线的性质和功能的研究已经有150年了。但是它们在加密技术上的应用是在1985年由华盛顿大学的NealKoblitz和IBM的VictorMiller首次提出的。椭圆曲线不是一个椭圆(椭圆形状),而是由交叉两个轴线(在一个图中用来说明点的位置的线)的环线表示。ECC基于一个数组产生的特定种类的方程式的性质,数组是由直线与轴线交叉的点组成的。用曲线上的点乘以一个数可以产生曲线上的另一个点,但是即使你知道原来的数和结果,你也很难找到乘的那个数。基于椭圆曲线的方程式有一个对加密技术来说非常有价值的性质:相对来说,方程式比较容易执行,但是反过来却非常困难。
工业上对椭圆曲线的使用还是有些保留。NigelSmart,惠普的研究员,发现了椭圆曲线的一个弱点,那就是一些曲线是极易受到攻击的。但是,Certicom公司的PhilipDeck说,虽然有一些曲线易受攻击,但那些正在使用ECC的人得知道哪些曲线是不能用的。他相信ECC作为一个技术可以提供一个独一无二的潜能,那就是它可以在世界范围内和所有设备中实现。依照Deck,“你要达到这个目的的唯一方法就是椭圆曲线。”
椭圆曲线加密法应用
基于椭圆曲线密码体制的网络身份认证系统
由于网络具有信息量大的特点,其主要威胁来自于非授权用户的非法访问,因此它对数据完整性的要求很高,需要最快的速度提供最高的安全性,保证信息的机密性、完整性和有效性。网络身份认证是依靠用户账号、口令或者生物特征等信息来实现的,这些认证方法在某种程度上存在着安全隐患,如账号、口令或指纹特征信息在存储、传输过程中可能被截取、被篡改等。在身份认证系统中,起关键作用的是其中的加密体系。本文设计的身份认证系统中,用户首先要通过认证模块进行注册,注册成功后,获得经过系统认证中心CA签名的公钥和私钥。用户公钥和CA的公钥都是公开信息,用户的私钥只有用户本人知道,由用户自己保存。
1.系统的总体结构
假设通信的是A与B双方,A与B处在同一个网络中,文本加解密采用对称算法AES,而密钥的传输与签名验签都采用非对称算法ECC.系统由服务器和客户端两部分组成,如图2所示,服务器端包括代理服务器、认证服务器、应用服务器;客户端包括代理客户端、认证客户端。代理客户端和代理服务器共同完成代理功能,认证客户端和认证服务器共同完成身份认证功能。
系统模型主要工作流程如下:
(1)将用户信息存放在系统数据库中;(2)客户端应用程序通过客户端代理向认证模块请求申请登录认证;(3)认证模块检查用户身份并完成认证过程,向客户端发放应用服务器的Ticket;(4)客户端向安全代理服务器请求获取访问策略数据;(5)安全代理服务器读取访问控制表中对应的策略控制记录,确定用户是否有权限访问相应的应用服务器资源;(6)确定用户有权访问后,连接到相应的应用服务器;(7)客户端与应用服务器间建立起了一条加密通道,双方通过此通道来交换数据。
2.系统功能模块及实现
(1)认证模块。认证模块主要实现身份认证、密钥分发等功能,采用基于公钥密码体制的改进Kerberos认证协议来对用户进行身份认证,是模型的核心部分。
认证模块由认证客户端模块、认证服务器端模块组成。当客户端代理接到来自客户端的任意请求时,先判断是否为客户端代理启动后接收到的第一个请求,如果是,则客户端代理必须先去认证服务器进行身份认证。
①认证客户端。认证客户端主要包括六个模块,分别为:AS请求模块、TGS请求模块、GSSAPI接口模块、KerberosGSSAPI模块、票据列出模块、票据销毁模块。
AS请求模块主要功能是用户获取TGS的票据TGT.当用户进行身份认证时,AS请求模块被调用,从AS服务器中获取TGT.AS请求模块包括获取Ticket模块和报错子模块。通过调用ECC加密模块,对每条信息进行必要的安全处理;TGS请求模块主要用于获得应用服务器的票据。在调用TGS请求之前,客户端必须己经得到TGT,以便用TGT向TG服务器证明自己的身份。GSSAPI接口模块用于实现与客户端代理的接口,客户端代理调用GSSAPI接口模块来进行身份认证;KerberosGSSAPI模块被GSSAPI接口模块调用,真正实现建立安全上下文,报文保护级别协商以及对每条报文的保护。通过调用KerberosGSSAPI模块,用户获得与代理服务器进行加密通信的会话密钥。票据列出模块用于列出保留在缓存中的主要实体名和当前所有活动票据的内容。票据销毁模块用于销毁所有的票据,以防止他人窃取票据,当用户断开与服务器的连接时,系统会调用该模块来销毁用户的票据。②认证服务器。认证服务器模块主要包括KDC模块、GSSAPI接口模块KerberosGSSAPI模块以及其他辅助模块。
KDC模块主要完成用户身份认证和票据分发等功能,包括AS请求处理子模块和TGS请求处理子模块。它与认证客户端的AS请求模块和TGS请求模块一起工作,来完成身份认证和票据分发功能;GSSAPI接口模块用于实现与代理服务器的接口,代理服务器调用GSSAPI接口模块来进行身份认证,而GSSAPI接口模块则调用KerberosGSSAPI,用于真正实现建立安全上下文,报文保护级别协商以及对每条报文的保护。
(2)代理模块。代理模块在模型中主要实现客户端应用程序通过代理客户端、代理服务器访问应用服务器的功能,通过采用Socks5协议实现。
代理模块分别在客户端和应用服务器端加载一个代理软件。客户端代理接受客户端的所有请求,经处理后转发给服务器端代理。客户端代理首先与代理服务器建立一个TCP连接,通常SOCKS端口为1080,通过安全隧道,代理服务器认证并接受所有来自客户端软件的通信。若身份得以认证,则安全服务器将请求递交应用服务器,处理请求后并将结果返回安全服务器,安全服务器将此结果返回给客户端。
安全代理服务器在确认客户端连接请求有效后接管连接,代为向应用服务器发出连接请求,安全代理服务器应根据应用服务器的应答,决定如何响应客户端请求,代理服务进程应当连接两个连接,客户端与代理服务进程间的连接、代理服务进程与应用服务器端的连接。为确认连接的唯一性与时效性,代理进程应当维护代理连接表或相关数据库。安全代理服务器为所有网络通信提供了一个安全隧道,在建立通道的过程中,存在用户认证的过程。用户经过认证和原始协议请求,通过GSSAPI建立的安全隧道传送。
3)加密模块。加密模块在系统中主要完成对数据的加解密处理,通过调用椭圆曲线加密算法具体实现。模型中采用ECIES加解密方案,具体实现过程采用borZoi算法库。borZoi是个免费的C++椭圆曲线加密库,含有完整的源代码,提供了定义在特征值为2的有限域上的算法,提供了加密模块
.TechTarget安全[引用日期]}

我要回帖

更多关于 椭圆曲线加密算法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信