Python:将dev / random输出连接到一个字符串

时间:2015-12-01 21:56:08

标签: python random unicode

我想将/ dev / random中的输出字节连接到我在程序中生成的字符串。但这给了我错误:

'ascii' codec can't decode byte 0xd9 in position 2: ordinal not in range(128)

所以我将dev / random输出转换为unicode

unicode(s, errors='ignore')

但是如果/ dev / random的输出发生了很多(long),那么这又会失败,因为它与unicode值不匹配。截至目前,我正在使用

从dev / random读取42个字节
open("/dev/random","rb").read(42)

但这可以是任意数量的字节。什么是连接这些值的安全方法,以便程序不会因任何值而失败。

2 个答案:

答案 0 :(得分:2)

这比访问" / dev / random"更容易。直接

>>> import os
>>> os.urandom(42)
b'\xb1\xc5"_>\x18\xdc\xb7\x0f\xc0\x86\x15\x00&\xc2S\x94\xf3\x10eT\xc5<\xbf3\x99\xd6\xa8\x06\xa3\x8fh@E7\xde8&k\xcd9\xcd'

如果你真的需要使用/ dev / random(可以阻止),请查看os.py,你会发现:

if not _exists("urandom"):
    def urandom(n):
        """urandom(n) -> str

        Return a string of n random bytes suitable for cryptographic use.

        """
        try:
            _urandomfd = open("/dev/urandom", O_RDONLY)
        except (OSError, IOError):
            raise NotImplementedError("/dev/urandom (or equivalent) not found")
        try:
            bs = b""
            while n - len(bs) >= 1:
                bs += read(_urandomfd, n - len(bs))
        finally:
            close(_urandomfd)
        return bs

请注意,因为这位于os.py - openreadcloseO_RDONLYos.openos.reados.closeos.O_RDONLY

如果你替换&#34; urandom&#34; - &GT; &#34;随机&#34;,您将获得使用&#34; / dev / random&#34; - 并且/ dev / random是exausted时阻塞。

答案 1 :(得分:0)

要将随机字节字符串转换为Unicode,您可以使用'latin-1'编码将n - 字节转换为n - Unicode代码点:

>>> bytearray(range(0x100)).decode('latin-1')
'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\...'