思路
1.这个密码题涉及到 RSA 加密和异或操作。我们已经知道了密文 ciphertext、公钥 N 和私钥 d 的值。我们需要找到原始消息。
首先,我们需要使用给定的 N 和 d 对密文 ciphertext 进行解密操作,得到明文 m。
python
m = pow(ciphertext, d, N)
然后,我们知道了明文 m 和异或密钥 key 的长度。由于明文 m 是通过异或密钥 key 进行异或操作得到的,我们可以得到 key 的长度。然后,我们可以使用 key 的长度从固定字符串中截取相应长度的部分作为 key。
python
key_length = len(long_to_bytes(m))
key = b'Life is like an ocean only strong-minded can reach the other shore'[:key_length]
接着,我们可以将 key 与解密后的明文 m 进行异或操作,得到原始消息。
python
original_msg = strxor(long_to_bytes(m), key)
这样,original_msg 就是解密后的原始消息。
2.在解密过程中,我们实际上不需要获取 key 的值,而是需要使用相同的过程来生成 key。在加密过程中,我们是根据输入消息的长度从固定字符串中截取与消息长度相同的部分作为 key。在解密过程中,我们需要重现这个过程,以便得到正确的 key。
所以,我们需要使用解密后的明文的长度来截取固定字符串中相应长度的部分作为 key。然后,将该 key 与解密后的明文进行异或操作,以还原出原始消息。代码如下所示:
python
msg_length = len(long_to_bytes(m))
key = b'Life is like an ocean only strong-minded can reach the other shore'[:msg_length]
original_msg = strxor(long_to_bytes(m), key)
3.实现脚本
from Crypto.Util.number import long_to_bytes
from Crypto.Util.strxor import strxor
m = pow(67254133265602132458415338912590207677514059205474875492945840960242620760650527587490927820914970400738307536068560894182603885331513473363314148815933001614692570010664750071300871546575845539616570277302220914885734071483970427419582877989670767595897758329863040523037547687185382294469780732905652150451, 4885628697024674802233453512637565599092248491488767824821990279922756927662223348312748794983451796542248787267207054348962258716585568185354414099671493917947012747791554070655258925730967322717771647407982984792632771150018212620323323635510053326184087327891569331050475507897640403090397521797022070233, 89714050971394259600440975863751229102748301873549839432714703551498380713981264101533375672970154214062583012365073892089644031804109941766201243163398926438698369735588338279544152140859123834763870759757751944228350552806429642516747541162527058800402619575257179607422628877017180197777983487523142664487)
key_length = len(long_to_bytes(1030318530773815943742979143417091812858550046016496885011))
key = b'Life is like an ocean only strong-minded can reach the other shore'[:key_length]
original_msg = strxor(long_to_bytes(m), key)
print(original_msg)