为什么哈希的输出输出看起来像\ x88H \ x98 \ xda(\ x04qQ vs�*�r?

时间:2017-08-25 13:06:09

标签: python encryption character-encoding

我是加密和编程的新手。我只是试图让我的头脑包围一些基本概念。

我正在使用python,Crypto.Hash.SHA256

D:\client>nmake

Microsoft (R) Program Maintenance Utility Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

cl.exe socket.c -I../include -L../lib -lssl -lcrypto
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

cl : Command line warning D9002 : ignoring unknown option '-L../lib'
cl : Command line warning D9002 : ignoring unknown option '-lssl'
cl : Command line warning D9002 : ignoring unknown option '-lcrypto'
socket.c
Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:socket.exe
socket.obj
LINK : fatal error LNK1104: cannot open file 'Ws2_32.lib'
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\cl.exe"' : return code '0x2'
Stop.

如果我输入

,则在REPL中
from Crypto.Hash import SHA256

VS

print SHA256.new('password').digest()//j���*�rBo��)'s`=

这两项产出是什么? 他们应该怎么解释?

1 个答案:

答案 0 :(得分:3)

在第一种情况下,您正在使用print,因此Python正在尝试将字节转换为可打印字符。不幸的是,并非每个字节都是可打印的,因此您会得到一些奇怪的输出。

在第二种情况下,由于您没有调用print,因此Python解释器会执行不同的操作。它采用返回值,在这种情况下是一个字符串,并显示字符串的内部表示。这就是为什么对于某些角色,你得到的东西是可打印的,但在其他情况下,你得到一个转义序列,如SHA256.new('password').digest()//"^\x88H\x98\xda(\x04qQ\xd0\xe5o\x8d\xc6)'s`=\rj\xab\xbd\xd6*\x11\xefr\x1d\x15B\xd8"

这两个输出恰好是同一摘要的两个表示。

仅供参考,在使用pycrypto查看哈希函数输出时,我强烈建议您使用\x88代替hexdigest