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 08:09:58 浏览: 143
这是一个使用 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 加密并对其进行签名,然后输出签名值和密文。
相关问题
CngKey.Import 导入ECDSA私钥
好的,你想了解关于CngKey.Import导入ECDSA私钥的问题。ECDSA是一种公钥密码学算法,用于数字签名和认证协议中。CngKey是.NET框架中的一个类,用于操作Windows Cryptography API (CNG)中的密钥。如果你有一个ECDSA私钥,可以使用CngKey.Import方法将其导入到CNG中。需要注意的是,导入密钥时必须指定正确的密钥格式,否则会导致错误。可以参考以下代码:
```
byte[] privateKeyBytes = // your ECDSA private key bytes
CngKey key = CngKey.Import(privateKeyBytes, CngKeyBlobFormat.EccPrivateBlob);
```
其中,CngKeyBlobFormat.EccPrivateBlob指定了密钥格式为ECC私钥。希望这能解答你的问题。
CngKey.Import 导入ECDSA私钥报错
如果使用CngKey.Import导入ECDSA私钥时出现错误,可能是因为密钥格式不正确或密钥数据损坏。建议你先检查密钥格式是否正确,可以通过以下代码检查密钥格式是否为ECC私钥:
```
byte[] privateKeyBytes = // your ECDSA private key bytes
if (privateKeyBytes[0] != 0x45 || privateKeyBytes[1] != 0x43 || privateKeyBytes[2] != 0x53 || privateKeyBytes[3] != 0x32)
{
// not ECC private key format
}
```
如果密钥格式正确,还可以尝试使用其他密钥格式进行导入,例如:
```
CngKey key = CngKey.Import(privateKeyBytes, CngKeyBlobFormat.EccPrivateBlob);
// or
CngKey key = CngKey.Import(privateKeyBytes, CngKeyBlobFormat.Pkcs8PrivateBlob);
```
如果仍然无法导入,可能是密钥数据损坏,需要检查密钥数据是否正确。希望这能帮助你解决问题。