目录
编码
Python里面的hash函数
以sha256为例:
1.加密字符串:
加盐—级联(update):
2.加密数字
str↔bytes
编码
- ASCII表:用8 bit 表示英文中所有的字符。
- GB2312:由于中国汉字过多,而1字节最多表示256个字符,于是对ASCII表进行了一个扩展,后续继续扩展为GB18030。
- Unicode:为每种语言中的每个字符设定了统一并且唯一的二进制编码。规定所有字符用两个字节表示。
- UTF :Unicode字符集转换格式,即将Unicode定义的数字转换成程序数据。对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同,中文文本占三字节。
UTF-8、UTF-16、UTF-32分别以BYTE(无符号8位整数)、WORD(无符号16位整数)、DWORD(无符号32位整数)作为编码单位。
以下均是python语言上的讨论,不涉及C/C++。
python的字符串默认是Unicode编码:
Unicode编码:str类型(字符串)——"xxxxx"
utf-8编码:bytes类型(二进制字符串类型数据)——b'xxxxx'
1.Unicode编码转换成其他编码: str.encode() #默认是utf-8编码,str→bytes
2.其他编码转换成Unicode编码: str.decode() #也就是转换成一般字符串 bytes→str
3.a,b编码转换:a编码先转化为Unicode编码,再由Unicode转换成b编码
Python里面的hash函数
python自带的hashlib库,hashlib是涉及安全散列和消息摘要,提供多个不同的加密算法接口,如SHA1、SHA224、SHA256、SHA384、SHA512、MD5等。
hash()函数其参数的数据类型:bytes类型
1.字符串 / 数字 转换为 bytes类型
字符串:m.encode() / bytes(m,encoding="utf-8") 转换为utf-8编码(bytes类型)
数字: bytes(n) 直接转换成bytes类型
2.hash值的类型:
hash.digest(): 返回2进制字符串类型的hash值(bytes类型)
hash.hexdigest():返回16进制字符串类型的hash值(str类型)
hash.update(n.encode()) 返回hash(m||n)的值(级联)
3.str类型↔int类型
int→16进制字符串:hex(123)="0x7b"
16进制字符串→int:int("7b",16)=123
以sha256为例:
1.加密字符串:
from hashlib import sha256
m="crypto"
# m.encode()字符串变成utf-8编码格式,才能用sha256加密
# sha256().hexdigest() 表示返回摘要,作为十六进制数据字符串值
#int("0xa",16) 将16进制字符串转换成int
hash=sha256(m.encode())
e=int(hash.hexdigest(),16) # e为int类型
#下面两种str->bytes方式相同
m.encode()
bytes(m,encoding="utf-8")
e=int(sha256(m.encode()).hexdigest(),16)
另一种方式:
import hashlib
m="crypto"
sha256=hashlib.sha256()
sha256.update(m.encode()) #不可将该式赋值,因为返回值为空
print(sha256.digest()) #不可写sha256.updata(m.encode()).digest(),因为
#sha256.updata(m.encode())返回值为空
#下面两者相同:
"crypto".encode()
b'crypto'
- m.encode() / bytes(m,encoding="utf-8") 转换成 bytes类型,才能加密
- sha256(m.encode()) 加密得到_hashlib.HASH类型(中间形式)
- sha256(m.encode()).hexdigest() 返回 16进制字符串类型 的hash值
- int(sha256(m.encode()).hexdigest(),16) 将16进制字符串转换成 int类型
类型转换:字符串→bytes类型→_hashlib.HASH类型→16进制字符串→int
"crypto"
b'crypto'
<sha256 HASH object @ 0x000001BEB9C02C10>
da2f073e06f78938166f247273729dfe465bf7e46105c13ce7cc651047bf0ca4
98687292787671481785167033227923050838847915443362959793501195795748475571364
digest()二进制字符串(bytes类型):
b'\xda/\x07>\x06\xf7\x898\x16o$rsr\x9d\xfeF[\xf7\xe4a\x05\xc1<\xe7\xcce\x10G\xbf\x0c\xa4'
加盐—级联(update):
from hashlib import sha256
salt="123" #盐
pwd="ccc"
hash = sha256(salt.encode('utf8')) #得到盐的hash值
hash.update(pwd.encode('utf8')) #得到 slat||pwd 的hash值
hash_value = hash.hexdigest() #返回十六进制字符串形式
#另一种写法,直接hash(salt||pwd)
hash=sha256(salt+pwd.encode('utf8'))
hash_value = hash.hexdigest()
2.加密数字
文本:Unicode编码,由str类型表示
二进制数据:bytes类型表示,bytes是一种比特流。
s="crypto"
b = bytes(s, encoding='utf-8')
print(b)
输出:b'crypto' #英文字符的bytes类型和str类型内容一样
s="中国"
b = bytes(s, encoding='utf-8')
print(b)
输出:b'\xe4\xb8\xad\xe5\x9b\xbd' #中文字符不一样,\xe4占1字节,每个汉字占3字节
整型数字得到bytes类型,可以直接 bytes(n)
from hashlib import sha256
n=123
e=sha256(bytes(n)).hexdigest()
print(e)
print(int(e,16))
str↔bytes
bytes→ str str→bytes
s1=str(n,encoding="utf-8") str函数 b2=bytes(m,encoding="utf-8") bytes函数
s2=n.decode() 编码 b1=m.encode() 编码
m="123" #str类型
n=b'456' #bytes类型
#bytes-> str
s1=str(n,encoding="utf-8") #str函数
s2=n.decode()
#str->bytes
b1=bytes(m,encoding="utf-8") #bytes函数
b2=m.encode()