这种加密有多安全? [关闭]

Posted

技术标签:

【中文标题】这种加密有多安全? [关闭]【英文标题】:How secure would this encryption be? [closed] 【发布时间】:2022-01-03 08:35:54 【问题描述】:

我有一个想法,用 python 的伪随机生成器生成的字节加密字符串,本质上创建一个一次性垫,这应该是安全的,问题是与随机生成器的播种有关以创建垫.

假设你不知道seed_key,随机生成器的种子冲突的可能性有多大?

#!/usr/bin/env python3

### IMPORTS ###
import random
from base91 import encode
from os import urandom

### CLASS DEFINITITON ###
class SeedPad:

    """ Encrypts a string with a one time pad generated by the pseudo random generator using a seed """

    def __init__(self, plain_text=None, cipher_text=None, seed_key=None):
        self.__plain_text = plain_text
        self.__cipher_text = cipher_text
        self.__seed_key = seed_key

    ### PROPERTY GETTERS ###
    @property
    def plain_text(self):
        return self.__plain_text

    @property
    def cipher_text(self):
        return self.__cipher_text

    @property
    def seed_key(self):
        return self.__seed_key

    ### PROPERTY SETTERS ###
    @plain_text.setter
    def plain_text(self, plain_text):
        self.__plain_text = plain_text

    @cipher_text.setter
    def cipher_text(self, cipher_text):
        self.__cipher_text = cipher_text
    
    @seed_key.setter
    def seed_key(self, seed_key):
        self.__seed_key = seed_key

    ### METHODS ###
    def encrypt(self):

        """ 
        takes a plain text string and returns a cipher_text as a hex string

        seed_key and plain_text must be set to use this method
        """

        if self.__plain_text is None:
            raise ValueError("plain_text is not set.")

        if self.__seed_key is None:
            self.__keygen()

        if type(self.__plain_text) != bytes:
            self.__plain_text = self.__plain_text.encode()

        random.seed(self.__seed_key)

        self.__cipher_text = ""

        for i in self.__plain_text:
            self.__cipher_text += f"i ^ random.randint(0,255):02x"

        return self.__cipher_text

    def decrypt(self):
        if self.__cipher_text is None:
            raise ValueError("cipher_text is not set.")

        if self.__seed_key is None:
            raise ValueError("seed_key is not set.")

        random.seed(self.__seed_key)

        # Convert hex string to bytes
        cipher_bytes = bytes.fromhex(self.cipher_text)


        self.__plain_text = ""

        for byte in cipher_bytes:
            self.__plain_text += chr(byte ^ random.randint(0, 255))

        return self.__plain_text

    def __keygen(self):
        self.__seed_key = encode(urandom(16))
        print("Random seed: ", self.__seed_key)


if __name__ == "__main__":
    
    from flag import flag, secret_key
    
    crypter = SeedPad(plain_text=flag, seed_key=secret_key)
    print(crypter.encrypt())

【问题讨论】:

Stack Overflow 不是代码审查或评论网站。您也许可以通过Code Review 或Information Security 获得更多帮助,但请确保您参加他们的导览并阅读他们的帮助中心首先 以确保您的问题切题。 谢谢,我早该知道,可能应该在我受到负面声誉之前撤掉这篇文章 当您创建密文时,您在该过程中使用随机整数,但我看不到您将这些随机整数存储在哪里,或者我看不到这些随机整数是从关键,所以我很困惑你如何在创建数据后解密数据,因为它是使用随机数创建的,然后被丢弃? @hostingutilities.com 他们使用种子来生成相同的值。 在解密算法结束时,您应该将self.__seed_key 设置回None。使用一次性密匙加密算法,如果一个人掌握了两条使用相同密钥加密的消息,他们将能够解密这些消息的内容。 【参考方案1】:

我相信您需要知道的一切都在 Random 类的文档中:

警告此模块的伪随机生成器不应用于安全目的。有关安全或加密用途,请参阅秘密模块。

还有:

Python 使用 Mersenne Twister 作为核心生成器。 . . .但是,由于是完全确定性的,它并不适合所有用途,并且完全不适合加密用途。

【讨论】:

谢谢,伪随机发生器可以播种,我正在使用该功能生成一次性垫,我不相信秘密模块可以播种,这只是一种相对将简短的秘密转换成一长串不重复的字节。 如果你只是想阻止你的室友阅读你的东西,那么继续使用它。如果您非常关心安全性,请使用众所周知的加密方法。发明自己的密码学一再导致失败。 resources.infosecinstitute.com/topic/…

以上是关于这种加密有多安全? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

这种数据加密/存储方法安全吗? [关闭]

我的“记住我”php 登录系统有多安全? [关闭]

这种散列技术有多强?

我的对称加密算法安全吗? [关闭]

大型电子商务网站有多快? [关闭]

您认为渐进增强有多重要? [关闭]