Loading

sage与椭圆曲线密码

【Sage代码】使用椭圆曲线密码体制进行加密/解密

#【Sage代码】使用椭圆曲线密码体制进行加密/解密
 
print("使用《密码编码学与网络安全——原理与实践(第七版)》的P228页的【椭圆曲线加密、解密】")
q = 257 # 书上选区素数 q=257
F = GF(q)
print(F)
print("素数域的阶: {0}".format(F.order()))
E = EllipticCurve(F, [0,0,0,  0, -4]) # 书上: Eq(a,b) = E257(0, -4)
print("【椭圆曲线E257(0, -4)】:{0}".format(E))
 
#获取基点坐标
print("默认的基点坐标:{0}".format( E.gens() ))
print("G = E.gens()[0] 中的G:{0}".format( E.gens()[0] ))
 
#获取基点的阶
print("椭圆曲线的【阶】,又叫【点群阶】,就是椭圆曲线密码体制中的【点】的个数。【注意:个数包括无穷远点o】")
q = E.order()
print("椭圆曲线的【阶】: {0}".format(q))
allPoints = E.points()
print("椭圆曲线上的所有点:{0}".format(allPoints))
 
print("(仅仅是试验一把)我们可以这么做 ==> 从椭圆曲线上任意随机选择一个点:")
print( E.points()[randint(2, E.order()-1)] )
 
print("") #打印空行
print("根据P228页:准备挑选【基点G(2,2)】,该基点G(2, 2)是Alice盒Bob共用的:")
G = E(2, 2)
print("挑选的【基点G】:{0}".format( G ))
 
print("Alice要给Bob发送**密文**,需要Bob的公钥!")
print("而Bob的公钥构造方法是: 一个随机数 * 基点G")
PrivateB = 101 # 私钥就是一个随机整数
print("Bob的私钥【PrivateB】是否初始化为101:{0}".format( PrivateB == 101 ))
Public_B = PrivateB * G 
print("Bob的公钥【Public_B】:{0}".format( Public_B ))
print("")
 
# Alice要使用椭圆曲线发送密文了
print("Alice要使用椭圆曲线发送密文了...")
print("Alice将密文编码为椭圆曲线上的一个点 Pm(112, 26)")
Pm = E(112, 26)
print("明文Pm是否初始化为(112, 26)? {0}".format( Pm==E(112, 26) ))
 
# 密文的构造方式: Cm = { k*G, Pm+k*Public_B }
print("密文的构造方式: Cm = { k*G, Pm+k*Public_B }")
k = 41 # 书上选择随机数为 41
kG = k * G #密文中的第1个点 k*G
Cm1 = kG
Cm2 = Pm + k*Public_B
print("随机数k={0}, 密文Cm的第1个点【kG】={1}, 密文Cm的第2个点【Pm+k*Public_B】={2}".format(k, Cm1, Cm2))
print("")
 
# Bob接收后进行解密,解密的算法是 P_recovery = Cm2 - PrivateB*Cm1
print("Bob接收后进行解密,解密的算法是 P_recovery = Cm2 - PrivateB*Cm1")
P_recovery = Cm2 - PrivateB*Cm1
print("Bob解密后的明文(温馨提示,应该还是椭圆曲线上的某个点):{0}".format(P_recovery))
print("解密结果是否正确? {0}".format( P_recovery == Pm ))

sage运行结果如下:

使用《密码编码学与网络安全——原理与实践(第七版)》的P228页的【椭圆曲线加密、解密】
Finite Field of size 257
素数域的阶: 257
【椭圆曲线E257(0, -4)】:Elliptic Curve defined by y^2 = x^3 + 253 over Finite Field of size 257
默认的基点坐标:((19 : 78 : 1),)
G = E.gens()[0] 中的G:(19 : 78 : 1)
椭圆曲线的【阶】,又叫【点群阶】,就是椭圆曲线密码体制中的【点】的个数。【注意:个数包括无穷远点o】
椭圆曲线的【阶】: 258
椭圆曲线上的所有点:[(0 : 1 : 0), (0 : 32 : 1), (0 : 225 : 1), (2 : 2 : 1), (2 : 255 : 1), (3 : 58 : 1), (3 : 199 : 1), (4 : 46 : 1), (4 : 211 : 1), (5 : 11 : 1), (5 : 246 : 1), (9 : 89 : 1), (9 : 168 : 1), (10 : 15 : 1), (10 : 242 : 1), (11 : 82 : 1), (11 : 175 : 1), (13 : 44 : 1), (13 : 213 : 1), (15 : 95 : 1), (15 : 162 : 1), (17 : 119 : 1), (17 : 138 : 1), (19 : 78 : 1), (19 : 179 : 1), (20 : 85 : 1), (20 : 172 : 1), (23 : 37 : 1), (23 : 220 : 1), (24 : 126 : 1), (24 : 131 : 1), (29 : 22 : 1), (29 : 235 : 1), (30 : 36 : 1), (30 : 221 : 1), (31 : 80 : 1), (31 : 177 : 1), (34 : 39 : 1), (34 : 218 : 1), (36 : 69 : 1), (36 : 188 : 1), (39 : 125 : 1), (39 : 132 : 1), (42 : 117 : 1), (42 : 140 : 1), (44 : 65 : 1), (44 : 192 : 1), (45 : 20 : 1), (45 : 237 : 1), (47 : 48 : 1), (47 : 209 : 1), (49 : 14 : 1), (49 : 243 : 1), (51 : 99 : 1), (51 : 158 : 1), (52 : 5 : 1), (52 : 252 : 1), (53 : 29 : 1), (53 : 228 : 1), (54 : 113 : 1), (54 : 144 : 1), (55 : 116 : 1), (55 : 141 : 1), (56 : 9 : 1), (56 : 248 : 1), (59 : 17 : 1), (59 : 240 : 1), (60 : 87 : 1), (60 : 170 : 1), (61 : 118 : 1), (61 : 139 : 1), (63 : 53 : 1), (63 : 204 : 1), (64 : 0 : 1), (68 : 84 : 1), (68 : 173 : 1), (69 : 109 : 1), (69 : 148 : 1), (70 : 71 : 1), (70 : 186 : 1), (75 : 52 : 1), (75 : 205 : 1), (76 : 4 : 1), (76 : 253 : 1), (80 : 56 : 1), (80 : 201 : 1), (82 : 108 : 1), (82 : 149 : 1), (83 : 27 : 1), (83 : 230 : 1), (84 : 40 : 1), (84 : 217 : 1), (86 : 100 : 1), (86 : 157 : 1), (90 : 12 : 1), (90 : 245 : 1), (92 : 105 : 1), (92 : 152 : 1), (93 : 86 : 1), (93 : 171 : 1), (94 : 124 : 1), (94 : 133 : 1), (97 : 24 : 1), (97 : 233 : 1), (99 : 67 : 1), (99 : 190 : 1), (100 : 3 : 1), (100 : 254 : 1), (101 : 64 : 1), (101 : 193 : 1), (104 : 75 : 1), (104 : 182 : 1), (109 : 60 : 1), (109 : 197 : 1), (112 : 26 : 1), (112 : 231 : 1), (113 : 98 : 1), (113 : 159 : 1), (117 : 111 : 1), (117 : 146 : 1), (120 : 106 : 1), (120 : 151 : 1), (122 : 41 : 1), (122 : 216 : 1), (125 : 101 : 1), (125 : 156 : 1), (126 : 107 : 1), (126 : 150 : 1), (127 : 54 : 1), (127 : 203 : 1), (129 : 96 : 1), (129 : 161 : 1), (136 : 128 : 1), (136 : 129 : 1), (137 : 8 : 1), (137 : 249 : 1), (139 : 42 : 1), (139 : 215 : 1), (141 : 115 : 1), (141 : 142 : 1), (143 : 91 : 1), (143 : 166 : 1), (147 : 16 : 1), (147 : 241 : 1), (149 : 94 : 1), (149 : 163 : 1), (150 : 103 : 1), (150 : 154 : 1), (153 : 110 : 1), (153 : 147 : 1), (155 : 55 : 1), (155 : 202 : 1), (156 : 120 : 1), (156 : 137 : 1), (157 : 92 : 1), (157 : 165 : 1), (158 : 30 : 1), (158 : 227 : 1), (159 : 127 : 1), (159 : 130 : 1), (160 : 50 : 1), (160 : 207 : 1), (161 : 25 : 1), (161 : 232 : 1), (163 : 6 : 1), (163 : 251 : 1), (164 : 7 : 1), (164 : 250 : 1), (165 : 77 : 1), (165 : 180 : 1), (168 : 122 : 1), (168 : 135 : 1), (169 : 49 : 1), (169 : 208 : 1), (170 : 21 : 1), (170 : 236 : 1), (171 : 23 : 1), (171 : 234 : 1), (174 : 88 : 1), (174 : 169 : 1), (176 : 51 : 1), (176 : 206 : 1), (177 : 35 : 1), (177 : 222 : 1), (178 : 59 : 1), (178 : 198 : 1), (179 : 61 : 1), (179 : 196 : 1), (183 : 33 : 1), (183 : 224 : 1), (185 : 13 : 1), (185 : 244 : 1), (188 : 31 : 1), (188 : 226 : 1), (192 : 19 : 1), (192 : 238 : 1), (193 : 121 : 1), (193 : 136 : 1), (197 : 90 : 1), (197 : 167 : 1), (200 : 10 : 1), (200 : 247 : 1), (201 : 93 : 1), (201 : 164 : 1), (202 : 97 : 1), (202 : 160 : 1), (203 : 79 : 1), (203 : 178 : 1), (210 : 1 : 1), (210 : 256 : 1), (213 : 81 : 1), (213 : 176 : 1), (214 : 38 : 1), (214 : 219 : 1), (216 : 112 : 1), (216 : 145 : 1), (217 : 62 : 1), (217 : 195 : 1), (218 : 72 : 1), (218 : 185 : 1), (219 : 76 : 1), (219 : 181 : 1), (221 : 63 : 1), (221 : 194 : 1), (223 : 28 : 1), (223 : 229 : 1), (225 : 102 : 1), (225 : 155 : 1), (226 : 70 : 1), (226 : 187 : 1), (228 : 104 : 1), (228 : 153 : 1), (229 : 114 : 1), (229 : 143 : 1), (231 : 47 : 1), (231 : 210 : 1), (233 : 43 : 1), (233 : 214 : 1), (234 : 57 : 1), (234 : 200 : 1), (236 : 66 : 1), (236 : 191 : 1), (240 : 123 : 1), (240 : 134 : 1), (243 : 74 : 1), (243 : 183 : 1), (245 : 18 : 1), (245 : 239 : 1), (246 : 83 : 1), (246 : 174 : 1), (249 : 68 : 1), (249 : 189 : 1), (252 : 34 : 1), (252 : 223 : 1), (253 : 73 : 1), (253 : 184 : 1), (254 : 45 : 1), (254 : 212 : 1)]
(仅仅是试验一把)我们可以这么做 ==> 从椭圆曲线上任意随机选择一个点:
(29 : 235 : 1)

根据P228页:准备挑选【基点G(2,2)】,该基点G(2, 2)是Alice盒Bob共用的:
挑选的【基点G】:(2 : 2 : 1)
Alice要给Bob发送**密文**,需要Bob的公钥!
而Bob的公钥构造方法是: 一个随机数 * 基点G
Bob的私钥【PrivateB】是否初始化为101:True
Bob的公钥【Public_B】:(197 : 167 : 1)

Alice要使用椭圆曲线发送密文了...
Alice将密文编码为椭圆曲线上的一个点 Pm(112, 26)
明文Pm是否初始化为(112, 26)? True
密文的构造方式: Cm = { k*G, Pm+k*Public_B }
随机数k=41, 密文Cm的第1个点【kG】=(136 : 128 : 1), 密文Cm的第2个点【Pm+k*Public_B】=(246 : 174 : 1)

Bob接收后进行解密,解密的算法是 P_recovery = Cm2 - PrivateB*Cm1
Bob解密后的明文(温馨提示,应该还是椭圆曲线上的某个点):(112 : 26 : 1)
解密结果是否正确? True
posted @ 2023-01-24 23:02  vconlln  阅读(172)  评论(0编辑  收藏  举报