非对称密码体制
《网络安全》第5-6讲(2.4)

2.4 公钥(非对称)密码体制
2.4.2 公钥密码体制的原理
公钥密码体制的基本数学方法和基本原理如下所述。 2.用于构造公钥密码的常用单向函数 1)多项式求根 有限域GF(p)上的一个多项式
f ( x) ( x anmod p
当给定多项式的系数和x、p以后,利用Honer算法,最多进行 n次乘法,n-1次加法,就可以求得y的值。但已知多项式的系数a 和y、p以后,要求x,就需要对高次方程求根,至少要进行不小 于n2(lbp)2的整数次乘法,当n、p很大时很难求解。
定n以后求p、q的问题称为RSA问题。求n=p×q分解问题有以下几种形式:
(1)分解整数n为p、q; (2)给定整数M、C,求d使得Cd≡M mod n; (3)给定整数k、C,求M使得Mk≡C mod n; (4)给定整数x、C,决定是否存在y使得x≡y2mod n(二次剩余问题)。
遵义师范学院
给定x求y是容易的,但是当p很大时,从x=logby中要计算x是非常困难 的。如b=2,p=2100,给定x求y,只需作100次乘法,利用高速计算机可 在0.1ms内完成。而给定y求x,所需计算量为1600年。可见,有限域 GF(p)中的指数函数f(x)=bx是一个单向函数。
x=logby
遵义师范学院
遵义师范学院
2.4 公钥(非对称)密码体制
2.4.1 公钥密码体制的基本概念 3.电子签证机关
电子签证机关(即CA)是负责颁发数字证书的权威机构。CA自 身拥有密钥对,可以使用私钥完成对其他证书的数字签名,同时也拥 有一个对外开放的证书(内含公钥)。网上的公众用户通过验证CA的 数字签名建立信任,任何人都可以得到CA的证书(含公钥),用以验 证它所签发的其他证书。如果用户想建立自己的证书,首先要向CA提 出申请证书的请求。在CA判明申请者的身份后,便为他分配一个密钥 对,并且CA将申请者的公钥与身份信息绑在一起,在为之完成数字签 名后,便形成证书发给那个用户(申请者)。如果一个用户想鉴别数 字证书是否为假冒的,可以用证书发证机构CA的公钥对该证书上的数 字签名进行验证,数字签名验证的过程是使用CA公钥解密的过程,验 证通过的证书就被认为是有效的。CA在公开密码体系中非常重要,负 责签发证书以及证书和密钥的管理等必要工作。CA相当于网上公安机 构,专门发放、验证电子身份证。
密码学6非对称密码体制课件

• 当e与m互素,则存在正整数d,使得
ed=1 (mod m) 称d是e关于模m的乘法逆元(简称“模 乘逆元”或“模逆元”),记作e-1 例如:设m=13,
则5*8=40=3*13+1=1 (mod 13) 故 5-1=8 • 欧拉定理
6.1 概述
6.1.1 对称密码体制的缺陷
• 密钥的安全传递比较困难
• n个用户多点通信所需密钥数为n(n-1)/2个
• 难以提供对主动攻击的抗击
6.1.2 公钥(非对称)密码体制的基本思想
Whitfield Diffie和Martin Hellman在1976年 首先提出:用公开的密钥(公钥)加密,用与之 对应的不公开的密钥(私钥)解密。
(将一个充分大的正整数分解成两个 素数之积几乎是不可能的) 1. 数学基础是著名的欧拉(Euler)数论
6.3.2 RSA密码体制的创建 • 选择两个充分大的不同的素数p和q • 计算积n=pq及其欧拉数φ(n)=(p-1)(q-1) • 选择一个介于1到φ(n)之间且与φ(n)互素的正整 数e 即1<e<φ(n)且GCD(e,φ(n))=1 • 求出d=e-1 (mod φ(n) ) 即e d=1 (mod φ(n) )
公钥密码体制提出的标志性文献──密码学 的新方向:
W.Diffie and , New Directions in Cryptography, IEEE Transaction on Information Theory, V.IT22.No.6, Nov 1976, PP.644-654
密码技术基础知识ppt课件

公钥基础设施
PKI系统组成
证书发布系统 证书发布系统负责证书的发放,如可以通过用户自己
,或是通过目录服务器发放。目录服务器可以是一个组织中现 存的,也可以是PKI方案中提供的。
20
公钥基础设施
PKI的应用
PKI的应用非常广泛,包括应用在web服务器和浏览器 之间的通信、电子邮件、电子数据交换(EDI)、在Intenet上的 信用卡交易和虚拟私有网(VPN)等。
对称加密算法相比非对称加密算法来说,加解密的效率要高得 多。但是缺陷在于对于秘钥的管理上,以及在非安全信道中通讯时, 密钥交换的安全性不能保障。所以在实际的网络环境中,会将两者混 合使用。
12
目录
公钥基础设施
简介 PKI系统组成 PKI的应用
13
公钥基础设施
简介
PKI是“Public Key Infrastructure”的缩写,意为“公钥基础 设施”。简单地说,PKI技术就是利用公钥理论和技术建立的提供信息 安全服务的基础设施。公钥体制是目前应用最广泛的一种加密体制, 在这一体制中,加密密钥与解密密钥各不相同,发送信息的人利用接 收者的公钥发送加密信息,接收者再利用自己专有的私钥进行解密。 这种方式既保证了信息的机密性,又能保证信息具有不可抵赖性。
26
数字摘要技术
数字摘要的常用技术
4、Base64 Base64是一种基于64个可打印字符来表示二进制数据的方法 ,由于2的6次方等于64,所以每6位为一个单元,对应摸个可打印字 符,三个娭毑有24位,,对应4个Base64单元,即三个字节需要用4个 打印字符来表示。
27
数字摘要技术
数字摘要的应用
40
密钥管理技术
密钥的分配
第4章-非对称密码体制-网络10

回代: 1 =19-6×3 =19-6×(60-3×19)=19×19-6×60 =19×(79-1×60)-6×60=19×79-25×60
=19×79-25×(3220-40×79)
=1019×79-25×3220 两边同时对模3220进行求余运算得
1019×79≡1 mod 3220
于是d =1019 (4)公开公钥PU ={e, n} = {79,3337}
20
ห้องสมุดไป่ตู้
RSA的安全性依赖于大数分解困难,即从一个密钥 和密文推断出明文的难度等同于分解两个大素数的 积。显然,分解n是最常遇到的攻击方法。在算法 中要求p和q均大于100位十进制数,这样的话n至少 200位十进制数,目前人们已能分解140多位的十进 制数的大素数。 最新记录是129位十进制数的因数分解,在网络通 过分布计算被成功分解。估计对200位十进制数的 因数分解,在亿次计算机上也要进行55万年。
23
2. 加密过程
(1)在公钥库中查得用户U的公开密钥:y; (2)对于明文m,随机选取一个整数r,r∈[0, p-1] (3)计算 c1≡ gr (mod p) c2 ≡ myr (mod p) (4)将(c1,c2)作为密文发给用户U.。 (1)先计算 w ≡ (c1x)-1 (mod p) (2)再计算出明文 m ≡ c2∙w(mod p)
10
图4-2 公钥认证模型
发送方A 攻击者 接收方B
消 息
M
解 密 算 法 PRA
C
加 密 算 法 PUA
M
消 息
密钥源
11
4.2 RSA密码体制
RSA密码体制是1977年由Rivest、Shamir、 Adleman提出的非常著名的公钥密码算法。
非对称密码体制课件

• 解决了对称密码的诸多局限性
2020/11/18
非对称密码体制
4
非对称密码基本概念:非对称密码体制
明文
加密器 EK
PK
密钥产生器
密文
解密器 DK
SK
明文
• 密钥—(PK, SK) • PK:俗称公钥(Public Key),通常公钥是公开的,可以被任何实 体通过有效渠道获取; • SK:俗称私钥(Secret Key),通常私钥是保密的,不能被任何实 体通过非法渠道获取;
2020/11/18
非对称密码体制
3
非对称密码基本概念:非对称密码的提出
• 对称密码的局限性 • 密钥管理的困难性问题 • 陌生人间的保密通信问题 • 数字签名问题
非对称密码(1976年由W. Diffie和M. Hellman提出)与对称密码的几点 区别:
• 双钥——双钥密码、公钥密码
• 基于数学函数,而非替换和换位
2020/11/18
非对称密码体制
6
非对称密码基本概念:非对称密码的算法组成
密钥生成KG( ) • 根据输入的安全参数 ,输出公钥和私钥对(PK, SK)
• 加密E( ) • 根据输入的公钥和消息,输出密文。
• 解密D( ) • 根据输入的解密私钥和密文,算法输出消息或输出表示密文不合法的特殊符号“?”
明文
加密器 EK
K
密文
解密器 DK
K
明文
密钥产生器
• 密钥管理:若N个人相互保密通信,每人必须拥有(N-1)个私钥,N很 大时,需要保存的私钥很多。如何解决?
• 可信中心分发:共需要发N*(N-1)/2个私钥:例如N =1000时, 999 *1000/2 = 499500
信息安全导论(4-3 密码基础-非对称密码)

37
RSA算法的安全性 RSA算法的安全性
RSA的安全性是基于分解大整数困难的假定 的安全性是基于分解大整数困难的假定 的安全性是基于分解大整数困难
如果RSA的模数 被成功地分解为 ×q,则 的模数n被成功地分解为 如果 的模数 被成功地分解为p× , 获得φ(n)=(p-1)(q-1),从而攻击者能够从 获得 , 公钥e解出 解出d, 公钥 解出 ,即d≡e-1 mod φ(n),攻击成 ≡ , 功.
由私钥及其他密码信息容易计算出公开密钥 由公钥及算法描述, 由公钥及算法描述,计算私钥是困难的
因此, 因此,公钥可以发布给其他人
6
非对称加密示意图
注意
注意
7
公钥密码的核心是使用一种特殊的函 数——单项陷门函数,从一个方向求值 单项陷门函数, 单项陷门函数 是容易的, 是容易的,但逆向计算很困难 定义: 是一个函数 是一个函数, 定义:设f是一个函数,如果对于任意给 定的x,计算y,使得y=f(x)是容易计算 定的 ,计算 ,使得 是容易计算 但对于任意给定的y,计算x是难解 的,但对于任意给定的 ,计算 是难解 即求f的逆函数是难解的 则称f是 的逆函数是难解的, 的,即求 的逆函数是难解的,则称 是 一个单向函数 一个单向函数
31
RSA中的计算问题
32
RSA中的计算问题
33
前例
则1=96-5×19=5*(-19)=5*77 mod96 = - × 5×77=1 mod96 × = 下为77 则5的乘法逆元在 mod96下为 的乘法逆元在 下为
34
例
35
36
验证: × = 验证:17×17=289=3×96+1=1 mod96 = × + =
38
《非对称密码体制》课件

使用扩展欧几里得算法,计算d, 满足d*e % phi(n) = 1。
2. 计算n
计算n=p*q。
4. 选择公钥
选择一个与phi(n)互质的整数e。
6. 完成
完成后,公钥由n和e组成,私钥由d组成。
RSA算法的解密过程
1. 加密数据
使用公钥(n, e)加密消息M,产生密文C。
2. 计算明文
1
1. 选择素数
选择一个素数q, 以及一个大素数p = kq + 1, 保护q。
2
2. 选取g值
选择一个能提供一个循环群的数g(1 <= g <= p-1)。
3
3. 计算x,y
任意选择一个512位的长整数k,然后计算x = g^k mod p, y = (hash(M) + x*a)/k mod q, hash(M)为M的哈希值。
使用私钥d,计算出原始消息M。M = Cd (mod n)
3. 完成
接收方使用私钥d,根据公式计算出M。
RSA算法的安全性分析
RSA算法显然会受到攻击,但我们认为这个算法还是安全的。攻击者可以使用因子分解算法来破解RSA 算法,但是这需要一个非常长的时间。对于RSA算法安全保护的加强,一般使用扩展和混淆技术。
非对称密码的优势
提高了数据传输的安全性, 避免了密钥管理的麻烦。
小提示
有时候也会将它们结合使 用,来发挥它们的优势。
典型的非对称密码算法
目前最流行的非对称密码算法有:RSA算法、DSA算法、ECC算法等。下图是其概述:
RSA算法
使用65000位的密钥。在加密 时使用一个公钥,但需要一个 私钥才能进行解密。
非对称密码体制
非对称密码体制ppt课件

病原体侵入机体,消弱机体防御机能 ,破坏 机体内 环境的 相对稳 定性, 且在一 定部位 生长繁 殖,引 起不同 程度的 病理生 理过程
小结
非对称密码体制 公开密钥加密系统基本原理如图所示。
公开密钥加密系统的优势是具有保密功能和鉴别功能。 公钥体制的主要特点:将加密和解密能力分开,实现多用户加 密的信息只能由一个用户解读,或一个用户加密的信息可由多用户 解读。
务,如:与哈希函数联合运用可生成数字签 名,可用于安全伪随机数发生器的构造,零 知识的证明等。
病原体侵入机体,消弱机体防御机能 ,破坏 机体内 环境的 相对稳 定性, 且在一 定部位 生长繁 殖,引 起不同 程度的 病理生 理过程
实例:使用加密软件PGP
• 软件介绍:PGP是全球著名的、在信息安 全传输领域首选的加密软件,其技术特性 是了非对称的“公钥”和“私钥”加密体 系,创造性地把RSA公钥体系和传统的加 密体系结合起来,是目前最难破译的密码 体系之一。
• Alice拥有Joy、Mike、Bob和Ted四个人的公钥。 当Alice采用Bob的公钥对明文进行加密,然后把 密文进行传输。当Bob收到后,应用Bob的私钥进 行解密,得到原始明文。即使在传输过程中,被 其他人得到密文,由于他们不拥有Bob的私钥, 所以不能进行解密,不能得到原始明文。这就是 公钥密码体制的加密过程。
病原体侵入机体,消弱机体防御机能 ,破坏 机体内 环境的 相对稳 定性, 且在一 定部位 生长繁 殖,引 起不同 程度的 病理生 理过程
实例:使用加密软件PGP
• 操作步骤:
– (1)安装软件; – (2)汉化软件; – (3)注册软件; – (4)创建和设置初始用户; – (5)导出并分发公钥; – (6)导入并设置其他人的公钥; – (7)使用公钥加密文件; – (8)将加密文件发送给对方; – (9)使用私钥进行解密。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
云南大学数学与统计学实验教学中心实验报告一、实验目的:通过实验掌握非对称密码体制的重要思想。
二、实验内容:查阅资料,实现RSA密码体制的编码算法、译码算法、密钥生成算法查阅资料,实现ECC密码体制的编码算法、译码算法、密钥生成算法三、实验环境Win7、Eclipse四、实验过程(请学生认真填写):实验过程、结果以及相应的解释:1. 预备知识非对称密码体制也叫公钥加密技术,该技术就是针对私钥密码体制的缺陷被提出来的。
在公钥加密系统中,加密和解密是相对独立的,加密和解密会使用两把不同的密钥,加密密钥(公开密钥)向公众公开,谁都可以使用,解密密钥(秘密密钥)只有解密人自己知道,非法使用者根据公开的加密密钥无法推算出解密密钥,顾其可称为公钥密码体制。
如果一个人选择并公布了他的公钥,另外任何人都可以用这一公钥来加密传送给那个人的消息。
私钥是秘密保存的,只有私钥的所有者才能利用私钥对密文进行解密。
公钥密码体制的算法中最著名的代表是RSA系统,此外还有:背包密码、McEliece密码、Diffe_Hellman、Rabin、零知识证明、椭圆曲线、EIGamal算法等。
公钥密钥的密钥管理比较简单,并且可以方便的实现数字签名和验证。
但算法复杂,加密数据的速率较低。
公钥加密系统不存在对称加密系统中密钥的分配和保存问题,对于具有n个用户的网络,仅需要2n个密钥。
公钥加密系统除了用于数据加密外,还可用于数字签名。
2. 实验过程(一)RSA加密算法A、原理分析:RSA的具体计算算法:假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。
她可以用以下的方式来产生一个公钥和一个私钥:1.随意选择两个大的质数p和q,p不等于q,计算N=pq。
2.根据欧拉函数,求得r= φ(n) = φ(p)φ(q) = (p-1)(q-1)3.选择一个小于r的整数e,求得e关于模r的模反元素,命名为d。
(模反元素存在,当且仅当e与r互质)4.将p和q的记录销毁。
(N,e)是公钥,(N,d)是私钥。
Alice将她的公钥(N,e)传给Bob,而将她的私钥(N,d)藏起来。
加密消息假设Bob想给Alice送一个消息m,他知道Alice产生的N和e。
他使用起先与Alice约好的格式将m转换为一个小于N的整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。
假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。
用下面这个公式他可以将n加密为c:计算c并不复杂。
Bob算出c后就可以将它传递给Alice。
解密消息Alice得到Bob的消息c后就可以利用她的密钥d来解码。
她可以用以下这个公式来将c转换为n:得到n后,她可以将原来的信息m重新复原。
解码的原理是以及ed ≡1 (mod p-1)和ed ≡ 1 (mod q-1)。
由费马小定理可证明(因为p和q是质数)和这说明(因为p和q是不同的质数,所以p和q互质)注:本内容参考维基百科RSA加密算法,可能与老师说的有略微不同。
B、具体代码如下://具体实现的代码//RSA实现时候用大数数来做比较简单public class RSA1 {private final static SecureRandom random = new SecureRandom();private static BigInteger d; // 为私钥{d,n}中的dprivate static BigInteger e; // 其实就是公钥 <e,n>中的eprivate static BigInteger n; // 为公开的 p x qprivate static BigInteger p; // 需要保密的大素数 p qprivate static BigInteger q;/*** 产生长度为N位的公钥和私钥* @param N*/public void genKey(int N) {// 产生两个N/2位的大素数p和qp = BigInteger.probablePrime(N / 2, random);q = BigInteger.probablePrime(N / 2, random);// 计算(p-1)*(q-1)BigInteger phi =(p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));// 计算模数p*qn = p.multiply(q);// 随便找一个b,使得gcd(b, phi) =1;// 通用的公钥是2^16 + 1=65537e = new BigInteger("65537");// 计算出a,即b的模n逆d = e.modInverse(phi);}/*** 加密函数* @param plainText* 明文* @return密文*/public byte[] encrypt(byte[] plainText) {return new BigInteger(plainText).modPow(e,n).toByteArray();}/*** 解密函数* @param cipherText* 密文* @return明文*/public byte[] decrypt(byte[] cipherText) {return new BigInteger(cipherText).modPow(d,n).toByteArray();}public static void main(String[] args) throws FileNotFoundException,IOException, ClassNotFoundException {RSA1 rsa = new RSA1();rsa.genKey(128); // 产生密钥// 加密一句消息byte[] cipher = rsa.encrypt("hello word".getBytes());System.out.println("RSA 加密:" + new String(cipher));// 解密byte[] plain = rsa.decrypt(cipher);System.out.println("RSA 解密:" + new String(plain));}}结果如下:运行时候,主要的是以下代码:运行结果如下图://得到结果与真实结果一样。
说明正确(二)ECC加密算法A、原理分析:椭圆曲线密码学(Elliptic curve cryptography,缩写为ECC)是基于椭圆曲线数学的一种公钥密码的方法。
椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。
ECC的主要优势是在某些情况下它比其他的方法使用更小的密钥——比如RSA加密算法——提供相当的或更高等级的安全。
ECC的另一个优势是可以定义群之间的双线性映射,基于Weil 对或是Tate对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。
不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。
ECC的具体计算算法:a)密钥的生成Bob(使用者)执行了下列计算:i) 在区间[1,n-1]中随机选取一个整数d。
ii) 计算点Q=dP (d个P相加)iii) Bob公开自己的公开密钥(E(Fq),p,n,Q)iv) Bob的私钥为整数d。
Alice要发送消息m给Bob,Alice执行:i) 查找Bob的公钥(E(Fq),p,n,Q),ii) 将m表示成一个域元素m∈Fq,iii) 在区间[1,n-1]内选取一个随机数k,iv) 依据Bob的公钥计算点(x1,y1)=kP(k个P相加)v) 计算点(x2,y2)=kQ,如果x2=0,则回到第iii)步Ⅵ)计算C=mx2Ⅶ)传送加密数据(x1,y1,C)给Bobb) Bob的解密过程Bob收到Alice的密文(x1,y1,C)后,执行i) 使用私钥d,计算点(x2,y2)=d(x1,y1)通过计算m=C*x2,恢复出明文数据B、具体代码如下://具体实现的代码package ECC;public class ECC {private int a, p;private POINT ukAlpha, ukBeta;private int rKey;/*** Method ECCImpClass*/public ECC(int a, int p, int priK, POINT alpha) { this.a = a;this.p = p;this.rKey = priK;Alpha = alpha;this.generatingUkBeta();}/*** 欧几里得算法--求逆元*/public int[] euclid(int x0, int y0) {int x, y, a, b, c, d, pa, pb, pc, pd, q, r;int[] res = new int[2];x = x0;y = y0;pa = 1;pb = 0;pc = 0;pd = 1;a = 1;b = 0;c = 0;d = 1;while (y != 0) {r = x % y;q = (x - r) / y;a = pc;b = pd;c = pa - q * pc;d = pb - q * pd;x = y;y = r;pa = a;pb = b;pc = c;pd = d;}if (a < 0) {a = a + y0;}res[0] = x;res[1] = a;return res;}/*** 求bmod p 下的逆元** @param a* @param b* @param p* @return*/public int aUpBModP(int a, int b, int p) { int invB, res1;a = a % p;b = b % p;int[] res = this.euclid(b, p);//System.out.println("b mod p 的逆元:" + res[1]);invB = res[1];res1 = (a * invB) % p;if (res1 < 0) {res1 = res1 + p;}return res1;}/*** 求2P** @param pt* @return*/public POINT doublePoints(POINT pt) {int x1, y1, x2, y2, lambda, n1, n2;x1 = pt.getX();y1 = pt.getY();n1 = 3 * x1 * x1 + this.a;n2 = 2 * y1;lambda = this.aUpBModP(n1, n2, this.p);x2 = (lambda * lambda - 2 * x1) % (this.p);y2 = ((x1 - x2) * lambda - y1) % (this.p);if (x2 < 0) {x2 = x2 + this.p;}if (y2 < 0) {y2 = y2 + this.p;}return new POINT(x2, y2);}/*** 求nP** @param m* @param pt* @return*/public POINT anyPoint(int m, POINT pt) { int k;if (m == 1)return pt;else if (m == 2)return this.doublePoints(pt);else {if (m % 2 == 0) {k = m / 2;POINT p1 = this.doublePoints(pt);return this.anyPoint(k, p1);} else {POINT p1 = this.anyPoint(m - 1, pt);return this.add2Points(pt, p1);}}}/*** 两个点相加** @param p1* @param p2* @return*/public POINT add2Points(POINT p1, POINT p2) { int x1, y1, x2, y2, x3, y3, lambda, n1, n2;if (p1.isSamePoint(p2))return this.doublePoints(p1);x1 = p1.getX();y1 = p1.getY();x2 = p2.getX();y2 = p2.getY();n1 = y2 - y1;n2 = x2 - x1;lambda = this.aUpBModP(n1, n2, this.p);x3 = (lambda * lambda - x1 - x2) % (this.p);y3 = ((x1 - x3) * lambda - y1) % (this.p);if (x3 < 0) {x3 = x3 + this.p;}if (y3 < 0) {y3 = y3 + this.p;}return new POINT(x3, y3);}/*** Beta = d * alpha 生成*/public void generatingUkBeta() {Beta = this.anyPoint(this.rKey, Alpha);}public POINT getUkBeta() {return Beta;}/*** 加密点pt** @param pt* @param ranK* @return*/public POINT[] encripting(POINT pt, int ranK) { POINT[] ct = new POINT[2];ct[0] = this.anyPoint(ranK, Alpha); // k*PPOINT temp = this.anyPoint(ranK, Beta);//k*Q=(x2,y2)ct[1] = this.anyPoint(temp.getX(), pt);// c = mx2return ct;}/*** 解密** @param ct* @return*/public POINT decripting(POINT[] ct) {POINT p1, p2, p3;p1 = new POINT();p1.setX(ct[0].getX());p1.setY(ct[0].getY());p2 = this.anyPoint(this.rKey, p1);// (x2,y2)int[] res = this.euclid(p2.getX(), this.p);p3 = this.anyPoint(res[1], ct[1]);// p3 = this.add2Points(ct[1], p2);return p3;}/*** Method main** @param args*/public static void main(String[] args) {System.out.println("\nTesting the ecc:");System.out.println("——对(5, 19)加密——");ECC ecc3 = new ECC(1, 23, 9, new POINT(3, 13));POINT beta = ecc3.getUkBeta();System.out.println("公钥,Q=(" + beta.getX() + "," + beta.getY() + ")");POINT[] ct = ecc3.encripting(new POINT(5, 19), 5);System.out.println("(x1,y1) = ("+ ct[0].getX() + ","+ ct[0].getY()+ ")");System.out.println("(x2,y2) = ("+ ct[1].getX() + ","+ ct[1].getY()+ ")");POINT x = ecc3.decripting(ct);System.out.println("解密(" + x.getX() + "," + x.getY() + ")");}}// 点类class POINT {private int x, y;public POINT() {}public POINT(int x, int y) {this.x = x;this.y = y;}public void setX(int x) {this.x = x;}public void setY(int y) {this.y = y;}public int getX() {return x;}public int getY() {return y;}public boolean isSamePoint(POINT p) {if (x == p.getX() && y == p.getY()) {return true;} else {return false;}}public void printPoint() {System.out.println("The point is (" + this.x + "," + this.y + ")");}public POINT signPoint() {return new POINT(-this.x, -this.y);}}结果如下:运行时候,主要的是以下代码:五、实验总结1.遇到的问题及分析:遇到问题:ECC中在求几点P的素数阶n是不会求分析并解决:-查阅资料也没有解决,后来想了到找了一个k>>n的一个数,这样来解决,但是个人感觉不太严谨。