如何解密用RSA加密的块?

时间:2017-04-02 08:16:39

标签: python cryptography rsa

我(仍然)在我的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',所以问题仍然存在。

感谢您的帮助,我们将非常感激

2 个答案:

答案 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-8UTF-16等编码。你可以致电clear_message.encode('utf-8')来做到这一点。解密后,您可以将解密的字节字符串转换回带有decrypted_bytes.decode('utf-8')的Unicode字符串。

您根本不需要convert_into_unicode功能。