其他分享
首页 > 其他分享> > missing semester - Security and Cryptography

missing semester - Security and Cryptography

作者:互联网

(Entropy) 度量了不确定性并可以用来决定密码的强度。

熵的单位是 bits(比特)。对于一个均匀分布的随机离散变量,熵等于 log_2(# of possibilities)。扔一次硬币的熵是1 bits,即log_2(2)。掷一次(六面)骰子的熵大约为2.58 bits,即log_2(6)。

使用多少比特的熵取决于应用的威胁模型。

XKCD漫画告诉我们,大约40比特的熵足以对抗在线穷举攻击(受限于网络速度和应用认证机制)。

而对于离线穷举攻击(主要受限于计算速度), 一般需要更强的密码 (比如80比特或更多)。

XKCD 936: Password Strength

散列函数

密码散列函数 (Cryptographic hash function) 可以将任意大小的数据映射为一个固定大小的输出

hash(value: array<byte>) -> vector<byte, N>  (N对于该函数固定)

SHA-1是Git中使用的一种散列函数, 它可以将任意大小的输入映射为一个160比特(可被40位十六进制数表示)的输出。

$ printf 'hello' | sha1sum
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
$ printf 'hello' | sha1sum
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
$ printf 'Hello' | sha1sum 
f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0

抽象地讲,散列函数可以被认为是一个不可逆,且看上去随机(但具确定性)的函数。 一个散列函数拥有以下特性:

密码散列函数的应用

密钥生成函数

密钥生成函数 (Key Derivation Functions) 与密码散列函数类似,用以产生一个固定长度的密钥。但是为了对抗穷举法攻击,密钥生成函数通常较慢。

密钥生成函数的应用

对称加密

对称加密使用以下几个方法来实现这个功能:

keygen() -> key  (这是一个随机方法)

encrypt(plaintext: array<byte>, key) -> array<byte>  (输出密文)
decrypt(ciphertext: array<byte>, key) -> array<byte>  (输出明文)

加密方法encrypt()输出的密文ciphertext很难在不知道key的情况下得出明文plaintext
解密方法decrypt()有明显的正确性。对于给定密文及其密钥,解密方法必须输出明文:decrypt(encrypt(m, k), k) = m

AES 是现在常用的一种对称加密系统。在 Linux 下可以使用 openssl 工具:

# 加密
openssl aes-256-cbc -salt -in {源文件名} -out {加密文件名}
# 解密
openssl aes-256-cbc -d -in {加密文件名} -out {解密文件名}

对称加密的应用

非对称加密

非对称加密的“非对称”代表在其环境中,使用两个具有不同功能的密钥: 一个是私钥(private key),不向外公布;另一个是公钥(public key),公布公钥不像公布对称加密的共享密钥那样可能影响加密体系的安全性。

keygen() -> (public key, private key)  (这是一个随机方法)

encrypt(plaintext: array<byte>, public key) -> array<byte>  (输出密文)
decrypt(ciphertext: array<byte>, private key) -> array<byte>  (输出明文)

sign(message: array<byte>, private key) -> array<byte>  (生成签名)
verify(message: array<byte>, signature: array<byte>, public key) -> bool  (验证签名是否是由和这个公钥相关的私钥生成的)

非对称的加密/解密方法和对称的加密/解密方法有类似的特征(公钥加密,私钥解密):
信息在非对称加密中使用 公钥 加密, 且输出的密文很难在不知道 私钥 的情况下得出明文。
解密方法decrypt()有明显的正确性。 给定密文及私钥,解密方法一定会输出明文: decrypt(encrypt(m, public key), private key) = m

签名/验证(sign/verify):

在不知道 私钥 的情况下,不管需要签名的信息为何,很难计算出一个可以使 verify(message, signature, public key) 返回为真的签名。

非对称加密的应用

密钥分发

非对称加密面对的主要挑战是,如何分发公钥并对应现实世界中存在的人或组织。

标签:加密,函数,Cryptography,semester,密钥,key,Security,散列,array
来源: https://www.cnblogs.com/cxl-/p/15367070.html