五子棋 day4

偷懒一天今天继续

需要进行一些验证:
1.验证:将数字31415926使用公钥加密后作为num字段提交到http://202.207.12.156:9014/step_05
如果没有错误,我们进行下一步。我们这里加密的是数字,而密码是个字符串,因此需要把字符串转换为数字。转换规则是这样的:把所有字符转换为ASCII,之后把字符串看作一个256进制的数,如:

'abc'
'a' = 97, 'b' = 98, 'c' = 99
'abc' = 97*256^2 + 98*256^1 + 99*256^0 = 6382179

就是做一次模幂即可,结果:

93881021929864980809174342694135963369278672668363116591635346676508616959803466385395110947590572285871635015799641415119061735125830808855763471006378541296998154431918842025919210489545546222811516276906010085975565730381040208928087282527065856602316379316169602170574703110733688951416363596477076057604

2.验证:将字符串hello, world!转换为数字后作为str2num字段提交到http://202.207.12.156:9014/step_05
如果没有错误,我们进行下一步。转换后的字符串可以加密了。
字符转换参考:https://www.runoob.com/python3/python3-ascii-character.html
倒序参考:https://www.cnblogs.com/huahuayu/p/8338388.html
字符转换:

str1 = input()
num = list(str1)
str2 = []
for i in reversed(num):
    str2.append(i)
asn = 0
a = 0
for i in str2:
    asn = asn + ord(i) * 256 ** a
    a = a + 1
print(asn)

结果:8271117963530313756381553648673

3.验证:将字符串hello, world!转换为数字,使用公钥加密后作为str字段提交到http://202.207.12.156:9014/step_05
加入公钥的模幂

def modular_exponentiation(base, exponential, mod):
    base = base % mod
    res = 1
    while exponential:
        if exponential & 1 == 1: #判断最后一位
            res = (res * base) % mod #为1则乘幂
        base = (base * base) % mod #累乘记录幂
        exponential >>= 1  #右移一位
    return res
exp = 65537
m = 135261828916791946705313569652794581721330948863485438876915508683244111694485850733278569559191167660149469895899348939039437830613284874764820878002628686548956779897196112828969255650312573935871059275664474562666268163936821302832645284397530568872432109324825205567091066297960733513602409443790146687029
self = eval(input())

print(modular_exponentiation(self, exp, m))

完整字符串加密:

def modular_exponentiation(base, exponential, mod):
    base = base % mod
    res = 1
    while exponential:
        if exponential & 1 == 1: #判断最后一位
            res = (res * base) % mod #为1则乘幂
        base = (base * base) % mod #累乘记录幂
        exponential >>= 1  #右移一位
    return res
exp = 65537
m = 135261828916791946705313569652794581721330948863485438876915508683244111694485850733278569559191167660149469895899348939039437830613284874764820878002628686548956779897196112828969255650312573935871059275664474562666268163936821302832645284397530568872432109324825205567091066297960733513602409443790146687029

str1 = input()
num = list(str1)
str2 = []
for i in reversed(num):
    str2.append(i)
asn = 0
a = 0
for i in str2:
    asn = asn + ord(i) * 256 ** a
    a = a + 1
self = asn
print(modular_exponentiation(self, exp, m))

结果:41717036756922086167767786786712423269418006844571540642506559265291791915434146228186913317848309015094527019477424371059092802944619669306914382602706827360526972065492061812094685980946805703427198780190727908992795654922187272049190698839062058797703366041101170679313306423879973490422740979302379859262

4.验证:将字符串hello, world!转换为数字,使用公钥加密后转换为16进制,作为hex字段提交到http://202.207.12.156:9014/step_05
hex函数转换即可,结果:0x3b68334487f782c227eefff8510c6d7b8568e50580e1d585360df7b381c15bc663ab6e867a475b52921ef254cfcbe328e074d5761e605b6aa8ab608fc9914a58d1120294986dcff70b46e92fa7d48edf4dbb104fa272eb459e8896e29d5d0473f75bb866d9f73ec1c134d827156ee355d19bdd94b8d73fe2526ada033a5cad3e

进制转换:
10进制转16:https://www.cnblogs.com/dylancao/p/10039062.html
16转10:https://www.it610.com/article/1292153603074629632.htm
https://www.cnblogs.com/zhangpengshou/archive/2012/03/12/2392068.html
https://blog.csdn.net/xHibiki/article/details/82924442
10转16:

def conv(string):
    my_dict = {"a": 10, "b": 11, "c": 12, "d": 13, "e": 14, "f": 15}
    li = []
    line = string.strip()[2:]
    for i in range(len(line)):
        li.append(my_dict.get(line[i]) if line[i] in my_dict else int(line[i]))
    return sum([li[i]*pow(16, len(li)-i-1) for i in range(len(li))])
print(conv("0x5dd6274e3dc70cba7de14ed269726fb061271f01a0e2265f83ae3714f0eb0e278ec39d051d0853b7f0eb8a4f8912586f156b8aa58b2bb574bf9f838980cfa058750503462985bbdf9ce728b60cda8a1e3c1890ec5b07d6f39ad522e5e8f2024f0f3b8fb876859a611e7f1bec5e1f02afa0fc421e1b911a9530ee6787879d90d0"))
#找不到原网址了,转载的

正式解题,任务 5:
把你的用户名作为user字段,加密后的密码作为password字段,提交到http://202.207.12.156:9014/step_05

不要急着找下一步的地址。作为一个确定性的程序,你的密码每次加密得到的结果都是一样的,我们可以为密码加噪,扰乱窃密者。在加密时,我们可以编码的信息不大于公钥中的第二个数字,这个数字很大,因此我们可以编码很长的信息。

在c/c++中字符串以字符\0作为结束标志,\0以后的所有数据都会被忽略掉,因此我们可以在密码后面添加一个字符\0,之后连接上一个随机生成的没用的字符串。这样每次都会产生不同的密文,就能更有效的保护你的密码了。去试试吧!

回到我们得到的信息,它也是被加密的,你需要解密,服务器使用它自己的私钥加密了数据,因为秘钥是对称的,你可以用公钥解密它。

返回的信息:5dd6274e3dc70cba7de14ed269726fb061271f01a0e2265f83ae3714f0eb0e278ec39d051d0853b7f0eb8a4f8912586f156b8aa58b2bb574bf9f838980cfa058750503462985bbdf9ce728b60cda8a1e3c1890ec5b07d6f39ad522e5e8f2024f0f3b8fb876859a611e7f1bec5e1f02afa0fc421e1b911a9530ee6787879d90d0

经过16转10:

65894257353491165333018780650081170085472379478187899460795461496573337276498047738349998864306203929022313251894750231530109976424881652981632143659410284031858962175263142675285774310344564740753776424367877876568481140118212942746650365956803804113293913411066219502126457390895424483049603666759682724048

公钥模幂后:

2073761573670096884002306397879788773621750512465269684913989281962311432966211551378170594103015672435338074093753232364939162759188877024692404497252590622126280681311647153708583170715401972995563964787085152253293798691928207843621868188169729833076

最后进行验证1 的逆运算

 97 * 256^2 + 98 * 256^1 + 99 * 256^0= a
=(((97*256)+98)*256+99)
设res = a%256 =9999 = 'c'
a = a//256

循环即可

中间看了一些列表逆序:https://www.cnblogs.com/minxiang-luo/p/12405115.html
https://blog.csdn.net/weixin_38564268/article/details/91445719
https://www.cnblogs.com/xuminzgl/p/11892233.html
解密:

a = eval(input())
str1 = []
while a:
    str1.append(chr(a % 256))  
    a = a // 256   #用/会报错因为结果是浮点数,所以用//
str1.reverse()
for i in str1:
    print(i, end="")

最后得到: http://202.207.12.156:9014/context/3ff280105813f582c7c38dabedd901bc

完成所有任务5

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值