import os import ecdsa import hashlib from Crypto.Util.number import * from Crypto.Util.strxor import strxor as xor import secret p = getPrime(256) gen = lambda: p + getPrime(16) pad = lambda m: m + os.urandom(32 - len(m) % 32) key = os.urandom(30) sk = ecdsa.SigningKey.from_secret_exponent( secexp=bytes_to_long(key), curve=ecdsa.SECP256k1 ) sig1 = sk.sign(data=b'This is the first message.', k=gen()).hex() sig2 = sk.sign(data=b'Here is another message.', k=gen()).hex() enc = xor(hashlib.sha512(key).digest(), pad(secret.flag)).hex() print(f"{sig1 = }\n{sig2 = }\n{enc = }") ''' sig1 = '3f4a6f288e35a4397201d246a98c1f9cfa463e67717fbbdcbd26d7fac75f875855455c2bfb355f7f593ffbe4c4bd1fc729cc129976b56905639100c8ac716b37' sig2 = '9f563b21f0ee31b2f7a1a8c6edc8ff23b63e0a9d5dd4a699ecc3164871b4982df51bb2feb4bc06c578afd21d3e6227231dd5fe1d8440f3dcd025fd3ea68f5516' enc = 'cc66d251bfa54954890c81dc1c607bae716573949f327db18aa1f4c0f420b8d29dc7e7ff9edb17b90306bd2aa753fc3fd4dafb9cc4b771cbdd79000ef05a40c0' '''
时间: 2023-07-15 11:09:58 浏览: 446
这是一个使用 ECDSA 签名和 XOR 加密的 Python 代码,主要分为以下几个步骤:
1. 生成一个 256 位的质数 p,然后再随机生成一个 16 位的质数,将两个相加得到一个 272 位的数作为 ECDSA 的生成元。
2. 随机生成一个 30 字节的密钥 key,使用 SHA-512 哈希函数对其进行哈希,得到一个 64 字节的哈希值作为加密密钥。
3. 使用 ECDSA 签名算法对两个明文消息 "This is the first message." 和 "Here is another message." 进行签名,其中 k 是一个随机数,生成的签名值 sig1 和 sig2 分别为 136 字节和 139 字节的十六进制字符串。
4. 对一个名为 secret.flag 的字符串进行填充,使其长度为 32 的倍数,然后使用 XOR 加密算法和上一步得到的加密密钥进行加密,得到一个 128 字节的密文 enc。
该代码的作用是将 secret.flag 加密并对其进行签名,然后输出签名值和密文。
相关问题
from Crypto.Signature import pss, DSS, pkcs1_15 signature = DSS.new(key, 'fips-186-3').sign(h) 将DSS替换成ECDSA
`from Crypto.Signature import pss, DSS, pkcs1_15` 这段代码是用来在PyCryptodome库中生成数字签名,其中`DSS`代表的是美国国家安全局(NSA)制定的Digital Signature Standard (DSS),而`ECDSA`则是一种基于椭圆曲线密码学的数字签名方案。
如果你想将DSS替换为ECDSA,你需要做以下几步操作:
1. 首先,确认你已经安装了支持ECDSA功能的PyCryptodome库,如果没有,可以使用`pip install pycryptodome`来安装。
2. 替换`DSS`为`ECDSA`:`signature = ECDSA.new(key, 'SHA256')`.这里假设你使用的是SHA256哈希函数,如果是其他哈希函数,比如SHA384或SHA512,只需修改'SHA256'为对应的哈希算法名。
3. 使用`sign()`方法:然后你可以像之前一样生成签名,`h`是你要签名的消息摘要。
完整的例子会是这样的:
```python
from Crypto.PublicKey import ECC
from Crypto.Signature import ecDSA, DSS
# 使用ECC生成公钥和私钥对
key_pair = ECC.generate(curve='P-256')
private_key = key_pair.export_key()
public_key = key_pair.public_key().export_key()
# 初始化ECDSA实例,指定哈希算法
signature_generator = ecDSA.new(private_key, hash_module=hashlib.sha256)
# 签名消息摘要
message_digest = hashlib.sha256(b'msg_to_sign').digest() # 示例消息
signature = signature_generator.sign(message_digest)
```
ECDSA host key for [isupport.semidrive.com]:29418 has changed and you have requested strict checking.
这是一个 SSH 错误提示信息,意思是你连接的主机([isupport.semidrive.com]:29418)的 ECDSA 主机密钥已经发生了改变,而你设置了严格的密钥检查,因此无法继续连接。可能是主机管理员更换了密钥或者你连接的不是你原来连接的主机。你可以尝试重新连接,如果还是无法连接,可以联系主机管理员解决该问题。
阅读全文
相关推荐











