我(仍然)在我的RSA项目上,现在我可以成功创建密钥,并用它们加密字符串
def encrypt(clear_message, public_key):
clear_list = convert_into_unicode (clear_message)
n = public_key[0]
e = public_key[1]
message_chiffre = str()
for i, value in enumerate (clear_list) :
encrypted_value = str( pow (int(value), e, n) )
encrypted_message += (encrypted_value )
return encrypted_message
def convert_into_unicode (clear_message):
str_unicode = ''
for car in clear_message:
str_unicode += str (ord (car))
if len (str_unicode ) % 5 != 0:
str_unicode += (5 - len (str_unicode ) % 5) * '0'
clear_list = []
i = 5
while i <= len (str_unicode ):
clear_list .append (str_unicode [i-5:i])
i += 5
return liste_claire
例如,加密消息“Hello World”会将['72101', '10810', '81113', '28711', '11141', '08100', '32330']
返回为clear_list
'3863 111 1616 3015 1202 341 4096'
为encrypted_message
解释:主程序中调用的函数是encrypt ()
。它使用另一个函数将字符串转换为unicode值的列表,但放入块,因为我已经读过了,否则很容易通过频率分析找到清晰的消息。
真的那么容易吗?
而且可能是,我来到我的主要问题。如您所知,字符的unicode值是两位数或三位数。在加密之前,Unicode值被分成5位数的块('stack' - &gt;'115 116 97 99 107' - &gt;'11511 69799 10700')
但问题是,当我想要解密时,我怎么知道我必须将该字符串分开以便一个数字代表一个字符? 我的意思是,前一个Unicode值可能是11或115(我知道它实际上不是11,但这只是一个例子)。所以要解密然后找回角色,问题是,我不知道我要拿多少数字。
当Unicode值为&lt;时,我曾想过添加'0'。 100,但是 1)然后用频率分析很容易做同样的事情 2)然而,当我加密它时,'087'会导致'467'而'089'会导致'046',所以问题仍然存在。
感谢您的帮助,我们将非常感激
答案 0 :(得分:3)
你正试图用玩具RSA问题来解决现实问题。可以执行频率分析,因为没有使用明文消息的随机填充。需要随机填充才能使RSA安全。
对于这种问题,直接使用每个字符的Unicode代码点(整数值)作为RSA的输入就足够了。但是,RSA只能直接加密[0..N]范围内的值,其中N是模数。如果你输入一个更大的值x,那么value将首先被转换为值x modulus N.在这种情况下,你松散的信息和解密将不再具有确定性。
对于密文,只需将其作为由空格分隔的整数值的字符串表示,并将它们拆分为读取它们。这将占用更多空间,但RSA总是有一定的开销。
如果您想实施安全的RSA,请阅读PKCS#1标准并注意时间攻击等。正如Wyzard已经指出的那样,请使用混合加密技术(除了RSA之外还使用对称加密)。
或者使用标准库,现在您了解RSA原则上的工作原理。
答案 1 :(得分:2)
您的convert_into_unicode
功能并未将任何内容转换为&#34; Unicode格式。假设clear_message
是一个Unicode字符串(Python 3中的默认字符串类型,或Python 2中的u''
),它已经(自然地)已经是Unicode,并且您使用的是尴尬将其转换为可以加密的字节序列的方法。如果clear_message
是字节字符串(Python 2中的默认值,或Python 3中的b''
),则所有字符都已经填入一个字节,因此整个过程是不必要的。
在加密之前,需要将Unicode字符串编码为字节序列。正常的方法是使用UTF-8或UTF-16等编码。你可以致电clear_message.encode('utf-8')
来做到这一点。解密后,您可以将解密的字节字符串转换回带有decrypted_bytes.decode('utf-8')
的Unicode字符串。
您根本不需要convert_into_unicode
功能。