密码学

Hellowongwong 2019-04-01 22:44:00
17
收藏
展开
密码学初探:
哈希,数字签名
对称加密:
用相同的密钥对原文进行加密和解密
加密过程:密钥+原文-密文
解密过程:密文-密钥=原文
缺点:无法保证密钥被安全传递
非对称加密:
公钥用于加密:私钥用于解密
公钥由私钥生成,私钥可以推导私钥
优点:解决了密码传输中的安全问题
解决来了传输中的安全问题
解决了信息传送的问题,如何验证‘确实是对方发送的,信件没有被篡改’
哈希-Hash
将一段数据(任意长度)经过计算,转换为一段定长的数据
不可以逆转
无碰撞性
使用场景:
发布文件的完整性验证
服务器中保存用户的密码
数字签名
SSl,加密解密
shal,md5
公钥加密,私钥解密
私钥加密签名,公钥解密签名
内容用接收方的公钥进行加密,然后用接收方的私钥进行解密(按照接收方的来)
签名:用发送方的私钥进行加密,用发送方的公钥进行解密(按照发送方的来)
用自己的私钥就可以证明是自己的签名,在用自己的公钥进行解密
数字签名的目的:
确认这个给你发信息的人是真正给你发信息的人,而不是某一个黑客截取了这个信息
然后在发送给你内容
CA:证书授权中心
CA解决了电子商务中公钥的可信度问题
负责证明我就是我
CA是收信人的第三方,公钥的合法性检验
CA证书的内容:
证书持有人的公钥
https访问网站
CA证书实例:
客户端会通过https向服务器发送安全链接其请求
服务器会用私钥加密网页内容,连同CA证书一起发送给客户端
客户端会验证CA证书是否合法:
如果验证失败,客户端弹出警告信息
如果验证成功的话,客户端使用CA证书中的公钥向服务器发送加密信息
对签名做一个哈希,在做一个签名,哈希之后生成摘要
哈希做摘要,在做签名
最后进行解密,对内容(接收方的私钥解密)进行哈希操作
然后和签名进行对比,如果相同,则是同一个人的
为什么对摘要进行签名?速度更快,如果是原文的话。则速度会慢一些
UTXO就是数字加锁定的脚本
用比特币拥有者的公钥锁定(加密)的一个数字
UTXO-比特币
公钥的哈希加一个数字
没有登录账号,任何人都可以看到你的账号
12.5加上交易费
交易确认
交易验证
数字签名
首先是用发送方的私钥进行加密》》加密之后
得到发送方的签名
用发送方的公钥解密
》》摘要
发送者的公钥哈希
以自己的公钥哈希锁定这个钱包地址
转载于:https://www.cnblogs.com/yunxintryyoubest/p/10639797.html
密码学基本知识

weixin_30341745 2015-09-18 17:38:00
50
收藏 1
展开
数字签名是什么?
作者:David Youd
原文网址:http://www.youdzone.com/signature.html
翻译:阮一峰
日期: 2011年8月 9日
今天,我读到一篇好文章。
它用图片通俗易懂地解释了,"数字签名"(digital signature)和"数字证书"(digital certificate)到底是什么。
我对这些问题的理解,一直是模模糊糊的,很多细节搞不清楚。读完这篇文章后,发现思路一下子就理清了。为了加深记忆,我把文字和图片都翻译出来了。
文中涉及的密码学基本知识,可以参见我以前的笔记。
====================================================
1.

鲍勃有两把钥匙,一把是公钥,另一把是私钥。
2.

鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。
3.

苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。
4.

鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
5.

鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)。
6.

然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature)。
7.

鲍勃将这个签名,附在信件下面,一起发给苏珊。
8.

苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。
9.

苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。
10.

复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密。
11.

后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。
12.

鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。
13.

苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。
14.
下面,我们看一个应用"数字证书"的实例:https协议。这个协议主要用于网页加密。

15.

首先,客户端向服务器发出加密请求。
16.

服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。
17.

客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。
18.

如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
19.

如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。
20.

如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。
(完)
密码学笔记
作者: 阮一峰
日期: 2006年12月10日
1.
加密方法可以分为两大类。一类是单钥加密(private key cryptography),还有一类叫做双钥加密(public key cryptography)。前者的加密和解密过程都用同一套密码,后者的加密和解密过程用的是两套密码。
历史上,人类传统的加密方法都是前一种,比如二战期间德军用的Enigma电报密码。莫尔斯电码也可以看作是一种私钥加密方法。
2.
在单钥加密的情况下,密钥只有一把,所以密钥的保存变得很重要。一旦密钥泄漏,密码也就被破解。
3.
在双钥加密的情况下,密钥有两把,一把是公开的公钥,还有一把是不公开的私钥。
双钥加密的原理如下:
a) 公钥和私钥是一一对应的关系,有一把公钥就必然有一把与之对应的、独一无二的私钥,反之亦成立。
b) 所有的(公钥, 私钥)对都是不同的。
c) 用公钥可以解开私钥加密的信息,反之亦成立。
d) 同时生成公钥和私钥应该相对比较容易,但是从公钥推算出私钥,应该是很困难或者是不可能的。
4.
目前,通用的单钥加密算法为DES(Data Encryption Standard),通用的双钥加密算法为RSA( Rivest-Shamir-Adleman),都产生于上个世纪70年代。
5.
在双钥体系中,公钥用来加密信息,私钥用来数字签名。
6.
因为任何人都可以生成自己的(公钥,私钥)对,所以为了防止有人散布伪造的公钥骗取信任,就需要一个可靠的第三方机构来生成经过认证的(公钥,私钥)对。目前,世界上最主要的数字服务认证商是位于美国加州的Verisign公司,它的主要业务就是分发RSA数字证书。
转自:
http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
http://www.ruanyifeng.com/blog/2006/12/notes_on_cryptography.html
转载于:https://www.cnblogs.com/gqtcgq/p/7247115.html
密码学知识入门
朝夕明月 2018-02-25 16:46:20 1225 收藏 3
展开
一、安全问题出现
现在越来越多的人利用互联网支付,转账等功能,方便之余,难免会心生疑问,账号会不会被人盗取?这就对数据安全提出了挑战,为了解决这个问题,数据的加密就显得异常重要了。
二、基本概念
加解密的过程就是发送方将明文通过密钥计算变成密文,接收方再将密文通过密钥计算变成可明文,从而保证在信息传输过程中的具备:可鉴别,完整,防泄漏。
可鉴别:通过验证签名的方式,可以知道发送消息的人是否是可信赖的对方
完整:通过算法不完整的数据和被串改的数据无法被解密
防泄漏:只要没有掌握密钥算法,即使内容被抓取到也无法得到真实的信息。
针对以上特性我们要着重介绍一下:对称算法、非对称算法,数字签名
对称算法
加解密使用同一个密钥,所以如何安全的传递密钥成了最头疼的问题。
(1) 甲方将明文使用密钥加密,密文传输给乙方。
(2) 乙方收到密文后,用同一个密钥,解密得到明文。
由于双方采用统一密钥规则,在传递和保持中如何保证密钥的安全,就成了头疼的问题。
### 非对称算法
加解密采用不同密钥,称为公钥和私钥,公私钥成对出现,采用公钥加密,只能用配对的私钥解密。
(1) 乙方生成一对公私钥,并将公钥给甲方
(2) 甲方利用乙方给的公钥将明文加密,生成密文,传输给乙方
(3) 乙方接收到密文,用配对的私钥解密,解出明文
这种方式私钥严格保密,公钥可以对外公布,解决了密钥传递和保存中的安全性问题。
在密码学中还有一个比较重要的概念就是确认发送方身份,也就是签名验证。
数字签名
数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。提到数字签名一定绕不开非对称算法和散列函数,数字签名有两个过程:签名和验证,具体的过程如下
(1) 乙方生成一对公私钥,并将公钥给甲方
(2) 乙方用其私钥对文件做加密,并签名
(3) 甲方对文件解密,并验证签名
由于文件内容做加解密算法比较费时,所以一般签名都是采用文件内容通过散列算法得出的字符串(图里的摘要可以认为就是这样的一串字符串)做私钥加密,从而得到一串签名数据,这样验签的效率就大大提升了。
算法举例
密码学发展到现在,涌现出来的算法有很多,比如对称算法中的des,aes,非对称算法中的RSA等,下面就以RSA做个实例解析。RSA的算法原理这里就不介绍了,请开wiki,直接上代码吧。本例子中的算法通过openssl的相关接口实现的。
RSA加密实现
// filename:密钥文件名
// plain_text:明文内容
// is_pubkey: true->公钥加密 false->私钥加密
// encrypt_txt:返回密文
int OpensslRSAUtil::encrypt(std::string filename, std::string plain_text, bool is_pubkey, std::string& encrypt_txt)
{
if (plain_text.empty())
{
return eAuthCryptResult_PARAM_ERROR;
}
RSA* rsa = RSA_new();
if (!create_rsa(filename, is_pubkey, &rsa)) {
if (rsa != NULL) RSA_free(rsa);
return eAuthCryptResult_CREATE_RSA_ERROR;
}
// 分段加密 每段117个字节
int data_len = plain_text.length();
int offset = 0;
int block_value = 0;
std::string encrypt_data = "";
int code = eAuthCryptResult_SUCCESS;
while(data_len > 0) {
char encode[MAX_ENCRYPT_BLOCK_VALUE] = {0};
if (data_len >= MAX_ENCRYPT_BLOCK_VALUE) {
block_value = MAX_ENCRYPT_BLOCK_VALUE;
} else {
block_value = data_len;
}
std::string ming = plain_text.substr(offset, block_value);
int ret = 0;
if (is_pubkey) {
ret = RSA_public_encrypt(block_value, (const unsigned char*)ming.c_str(), (unsigned char*)encode, rsa, RSA_PKCS1_PADDING);
} else {
ret = RSA_private_encrypt(block_value, (const unsigned char*)ming.c_str(), (unsigned char*)encode, rsa, RSA_PKCS1_PADDING);
}
if (ret >= 0) {
std::string encrypt_tmp(encode, ret);
encrypt_data += encrypt_tmp;
offset += block_value;
data_len = data_len - block_value;
} else {
code = eAuthCryptResult_ENCRYPT_ERROR;
break;
}
}
if (code == eAuthCryptResult_SUCCESS) {
// base64 加密
char* base64Text = NULL;
int len = 0;
cout << "len:" << encrypt_data.length()<<endl;
base64_encode((const unsigned char*)encrypt_data.c_str(), encrypt_data.length(), &base64Text, len);
if (base64Text == NULL) {
code = eAuthCryptResult_BASE64_ENCODE_ERROR;
} else {
std::string tmp(base64Text, len);
encrypt_txt = tmp;
replaceString(encrypt_txt, "\n", "");
free(base64Text);
}
}
RSA_free(rsa);
CRYPTO_cleanup_all_ex_data();
return code;
}
RSA解密实现
// filename:密钥文件名
// plain_text:密文内容
// is_pubkey: true->公钥解密 false->私钥解密
// decrypt_txt:返回明文
int OpensslRSAUtil::decrypt(std::string filename, std::string plain_text, bool is_pubkey, std::string& decrypt_txt)
{
if (plain_text.empty())
{
return eAuthCryptResult_PARAM_ERROR;
}
RSA* rsa = RSA_new();
if (!create_rsa(filename, is_pubkey, &rsa)) {
if (rsa != NULL) RSA_free(rsa);
return eAuthCryptResult_CREATE_RSA_ERROR;
}
// base64解密
unsigned char* decode_data = NULL;
size_t data_len = 0;
base64_decode(plain_text.c_str(), &decode_data, &data_len);
if (decode_data == NULL) {
RSA_free(rsa);
return eAuthCryptResult_BASE64_ENCODE_ERROR;
}
// 分段解密 每段128个字节
int offset = 0;
int block_value = 0;
int code = eAuthCryptResult_SUCCESS;
while(data_len > 0) {
char decode[MAX_DECRYPT_BLOCK_VALUE];
if (data_len >= MAX_DECRYPT_BLOCK_VALUE) {
block_value = MAX_DECRYPT_BLOCK_VALUE;
} else {
block_value = data_len;
}
unsigned char* mi = decode_data + offset;
int ret = 0;
if (is_pubkey) {
ret = RSA_public_decrypt(block_value, mi, (unsigned char*)decode, rsa, RSA_PKCS1_PADDING);
} else {
ret = RSA_private_decrypt(block_value, mi, (unsigned char*)decode, rsa, RSA_PKCS1_PADDING);
}
if (ret >= 0) {
string tmp(decode, ret);
decrypt_txt += tmp;
offset += block_value;
data_len = data_len - block_value;
} else {
code = eAuthCryptResult_DECRYPT_ERROR;
char msg[1024];
print_last_error(msg);
break;
}
}
if (decode_data != NULL) {
free(decode_data);
}
RSA_free(rsa);
CRYPTO_cleanup_all_ex_data();
return code;
}
RSA签名实现
// privkey_filename:私钥文件名
// plain_text:明文内容
// signature:返回签名字符串
int OpensslRSAUtil::sign(std::string privkey_filename, std::string plain_text, std::string& signature)
{
if (plain_text.empty())
{
return eAuthCryptResult_PARAM_ERROR;
}
RSA* rsa = RSA_new();
if (!create_rsa(privkey_filename, false, &rsa)) {
if (rsa != NULL) RSA_free(rsa);
return eAuthCryptResult_CREATE_RSA_ERROR;
}
unsigned char* encMessage = NULL;
char* base64Text = NULL;
int len = 0;
size_t encMessageLength;
int code = eAuthCryptResult_SUCCESS;
if (rsa_sign(rsa, (unsigned char*)plain_text.c_str(), plain_text.length(), &encMessage, &encMessageLength)) {
base64_encode(encMessage, encMessageLength, &base64Text, len);
std::string tmp(base64Text, len);
signature = tmp;
replaceString(signature, "\n", "");
} else {
code = eAuthCryptResult_SIGN_ERROR;
}
if (encMessage != NULL) {
free(encMessage);
}
if (base64Text != NULL) {
free(base64Text);
}
RSA_free(rsa);
CRYPTO_cleanup_all_ex_data();
return code;
}
RSA验签实现
// pubkey_filename:私钥文件名
// plain_text:密文内容
// signature:签名字符串
// verify_result:返回验签结果
int OpensslRSAUtil::verify(std::string pubkey_filename, std::string plain_text, std::string signature, bool& verify_result)
{
if (plain_text.empty())
{
return eAuthCryptResult_PARAM_ERROR;
}
RSA* rsa = RSA_new();
if (!create_rsa(pubkey_filename, true, &rsa)) {
if (rsa != NULL) RSA_free(rsa);
return eAuthCryptResult_CREATE_RSA_ERROR;
}
unsigned char* encMessage = NULL;
size_t encMessageLength;
bool authentic = false;
base64_decode(signature.c_str(), &encMessage, &encMessageLength);
bool result = rsa_verify_signature(rsa, encMessage, encMessageLength, plain_text.c_str(), plain_text.length(), authentic);
int code = eAuthCryptResult_SUCCESS;
if (result) {
verify_result = authentic;
} else {
code = eAuthCryptResult_VERIFY_ERROR;
}
if (encMessage != NULL) {
free(encMessage);
}
RSA_free(rsa);
CRYPTO_cleanup_all_ex_data();
return code;
}
结束
简单的介绍了一下,密码学的相关知识,偏实用,淡算法理论,有兴趣自己扩展,对实现代码有疑问,可以留言。
参考文献
密码学基础
RSA原理介绍
————————————————
版权声明:本文为CSDN博主「朝夕明月」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lenyusun/article/details/79369857
密码学基础
注:本文不涉及复杂的算法,主要是梳理密码学知识体系,为以后系统地深入地学习打好基础。
整理本文的过程中,主要参考了以下文档:
https://wenku.baidu.com/view/e837a8a86137ee06eff918a3.html?sxts=1534474835258
https://wenku.baidu.com/view/97639ced32d4b14e852458fb770bf78a64293a7b.html
https://wenku.baidu.com/view/692127f90875f46527d3240c844769eae009a39b.html
https://wenku.baidu.com/view/8e8a251aa32d7375a41780dd.html
一、概述
密码学是研究如何保护信息安全性的一门科学,涉及数学、物理、计算机、信息论、编码学、通讯技术等学科,已经在生活中得到广泛应用。
密码学组成分支分为编码学和密码分析学。密码编码学主要研究对信息进行编码,实现信息的隐蔽。密码分析学主要研究加密消息的破译或消息的伪造。二者相互独立,又相互依存,在矛盾与斗争中发展,对立统一。
1.1、发展史
密码学的发展历史大致可划分为三个阶段:
阶段一(古代到19世纪末):密码技术还不是一门科学,密码学家靠手工和机械来设计密码。
阶段二(20世纪初到1975年):建立了私钥密码理论基础,从此密码学成为了一门科学,计算机的出现使得基于复杂计算的密码成为可能。
阶段三(1976年到现在):出现公钥密码,同时私钥密码技术也在飞速发展,密码学被广泛应用到与人们息息相关的问题上。
1.2 功能与目标
机密性
仅有发送方和指定的接收方能够理解传输的报文内容。窃听者可以截取到加密了的报文,但不能还原出原来的信息,即不能得到报文内容。
鉴别
发送方和接收方都应该能证实通信过程所涉及的另一方, 通信的另一方确实具有他们所声称的身份。即第三者不能冒充跟你通信的对方,能对对方的身份进行鉴别。
报文完整性
即使发送方和接收方可以互相鉴别对方,但他们还需要确保其通信的内容在传输过程中未被改变。
不可否认性
如果人们收到通信对方的报文后,还要证实报文确实来自所宣称的发送方,发送方也不能在发送报文以后否认自己发送过报文。
1.3 密码体制
在理解密码体制之前,需要先了解以下专业术语:
明文:能直接代表原文含义的信息
密文:经过加密处理之后,隐藏原文含义的信息
加密:将明文转换成密文的实施过程
解密:将密文转换成明文的实施过程
密钥:控制加密或解密过程的可变参数,分为加密密钥和解密密钥
密码体制是一个使通信双方能进行秘密通信的协议。密码体制由五要素组成,P(Plaintext明文集合),C(Ciphertext密文集合),K(Key密钥集合),E(Encryption加密算法),D(Decryption解密算法),且满足如下特性:
p∈P
c∈C
k1∈K,k2∈K
Ek1(p)=c,Dk2(c)=p

1.4 加密基本原理
无论是用手工或机械完成的古典密码体制,还是采用计算机软件方式或电子电路的硬件方式完成的现代密码体制,其加解密基本原理都是一致的。都是基于对明文信息的替代或置换,或者是通过两者的结合运用完成的。
替代(substitution cipher):有系统地将一组字母换成其他字母或符号;
例如‘help me’变成‘ifmq nf’(每个字母用下一个字母取代)。
置换(Transposition cipher):不改变字母,将字母顺序重新排列;
例如‘help me’变成‘ehpl em’(两两调换位置)。
1.5 密码分析与攻击:
密码分析者通常利用以下几种方法对密码体制进行攻击:
已知明文分析法:
知道一部分明文和其对应的密文,分析发现秘钥。
选定明文分析法:
设法让对手加密自己选定的一段明文,并获得对应的密文,在此基础上分析发现密钥。
差别比较分析法:
设法让对方加密一组差别细微的明文,通过比较他们加密后的结果来分析秘钥。
1.6 密码安全性
无条件安全:
无论破译者的计算能力有多强,无论截获多少密文,都无法破译明文。
计算上安全:
破译的代价超出信息本身的价值,破译所需的时间超出信息的有效期。
任何密码系统的应用都需要在安全性和运行效率之间做出平衡,密码算法只要达到计算安全要求就具备了实用条件,并不需要实现理论上的绝对安全。1945年美国数学家克劳德·E·香农在其发布的《密码学的数学原理》中,严谨地证明了一次性密码本或者称为“弗纳姆密码”(Vernam)具有无条件安全性。但这种绝对安全的加密方式在实际操作中需要消耗大量资源,不具备大规模使用的可行性。事实上,当前得到广泛应用的密码系统都只具有计算安全性。
1.7 密码设计原则:
一个好的密码体制应该满足以下两个条件:
在已知明文和密钥的情况下,根据加密算法计算密文是容易的;在已知密文和解密密钥的情况下,计算明文是容易的。
在不知道解密密钥的情况下,无法从密文计算出明文,或者从密文计算出明文的代价超出了信息本身的价值。
二、 密码体制分类
2.1 对称密码(私钥密码)
对称密码体制也称单钥或私钥密码体制,其加密密钥和解密密钥相同,或实质上等同, 即从一个易于推出另一个。
优点:保密性高,加密速度快,适合加密大量数据,易于通过硬件实现;
缺点:秘钥必须通过安全可靠的途径传输,秘钥的分发是保证安全的关键因素;

常见对称密码算法:DES (密钥长度=56位)、3DES( 三个不同的密钥,每个长度56位)、AES(密钥长度128/192/256可选)、IDEA(密钥长度128位)、RC5(密钥长度可变)。
根据加密方式的不同,对称密码又可以分为分组密码和序列密码。
2.1.1 分组密码
将明文分为固定长度的组,用同一秘钥和算法对每一块加密,输出也是固定长度的密文,解密过程也一样。

2.1.2 序列密码
又称为流密码,每次加密一位或一字节的明文,通过伪随机数发生器产生性能优良的伪随机序列(密钥流),用该序列加密明文消息序列,得到密文序列,解密过程也一样。

2.2 非对称密码(公钥密码)
非对称密码体制又称双钥或公钥密码体制,其加密密钥和解密密钥不同,从一个很难推出另一个。其中的加密密钥可以公开,称为公开密钥,简称公钥;解密密钥必须保密,称为私有密钥,简称私钥。
优点:密钥交换可通过公开信道进行,无需保密。既可用于加密也可用于签名。
缺点:加密速度不如对称密码,不适合大量数据加密,加密操作难以通过硬件实现。

非对称密码体制不但赋予了通信的保密性,还提供了消息的认证性,无需实现交换秘钥就可通过不安全信道安全地传递信息,简化了密钥管理的工作量,适应了通信网的需要,为保密学技术应用于商业领域开辟了广阔的前景。
常见的非对称密码算法:RSA(基于大整数质因子分解难题)、ECC(基于椭圆曲线离散对数难题)。
对非对称密码的误解
非对称密码比对称密码更安全?
任何一种算法的安全都依赖于秘钥的长度、破译密码的工作量,从抗分析的角度看,没有哪一方更优越;
非对称密码使对称密码成为过时技术?
公钥算法很慢,一般用于密钥管理和数字签名,对称密码将长期存在,实际工程中采用对称密码与非对称密码相结合。
三、哈希函数与数字签名
3.1 哈希函数
哈希函数将任意长的消息映射为一个固定长度的散列值,也称消息摘要。消息摘要可以作为认证符,完成消息认证。
哈希是单向函数,从消息摘要来推理原消息是极为困难的。哈希函数的安全性是由发生碰撞的概率决定的。如果攻击者能轻易构造出两个不同的消息具有相同的消息摘要,那么这样的哈希函数是不可靠的。
常见的哈希函数有:MD5,SHA1,HMAC。
3.2 数字签名
数字签名是公钥密码的典型应用,可以提供和现实中亲笔签名相似的效果,在技术上和法律上都有保证。是网络环境中提供消息完整性,确认身份,保证消息来源(抗抵赖性)的重要技术。
数字签名与验证过程:
发送方用哈希函数从报文文本中生成一个128位的散列值(或报文摘要),发送方用自己的私钥对这个散列值进行加密来形成自己的数字签名。然后,这个数字签名将作为报文的附件和报文一起发送给接收方。接收方收到报文后,用同样的哈希函数从原始报文中计算出散列值(或报文摘要),接着再用发送方的公钥来对报文附加的数字签名进行解密得出另一个散列值,如果两个散列值相同,那么接收方就能确认该数字签名是发送方的。通过数字签名能够实现消息的完整性和不可抵赖性。

四、密钥管理与PKI
在网络安全中,密钥的地位举足轻重。如何安全可靠、迅速高效地分配密钥、管理密钥一直是密码学领域中的重要问题。
4.1 密钥管理
4.1.1 密钥生成
密钥生成可以通过在线或离线的交互协商方式实现,如密码协议等 。密钥长度应该足够长。一般来说,密钥长度越大,对应的密钥空间就越大,攻击者使用穷举猜测密码的难度就越大。选择密钥时,应该避免选择弱密钥,大部分密钥生成算法采用随机过程或伪随机过程生成密钥。
4.1.2 密码分发
采用对称加密算法进行保密通信,需要共享同一密钥。通常是系统中的一个成员先选择一个秘密密钥,然后将它传送另一个成员或别的成员。X9.17标准描述了两种密钥:密钥加密密钥和数据密钥。密钥加密密钥加密其它需要分发的密钥;而数据密钥只对信息流进行加密。密钥加密密钥一般通过手工分发。为增强保密性,也可以将密钥分成许多不同的部分然后用不同的信道发送出去。
4.1.3 密钥验证
密钥附着一些检错和纠错位来传输,当密钥在传输中发生错误时,能很容易地被检查出来,并且如果需要,密钥可被重传。接收端也可以验证接收的密钥是否正确。发送方用密钥加密一个常量,然后把密文的前2-4字节与密钥一起发送。在接收端,做同样的工作,如果接收端解密后的常数能与发端常数匹配,则传输无错。
4.1.4 密钥更新
当密钥需要频繁的改变时,频繁进行新的密钥分发的确是困难的事,一种更容易的解决办法是从旧的密钥中产生新的密钥,有时称为密钥更新。可以使用单向函数进行更新密钥。如果双方共享同一密钥,并用同一个单向函数进行操作,就会得到相同的结果。
4.1.5 密钥存储
密钥可以存储在脑子、磁条卡、智能卡中。也可以把密钥平分成两部分,一半存入终端一半存入ROM密钥。还可采用类似于密钥加密密钥的方法对难以记忆的密钥进行加密保存。
4.1.6 密钥备份
密钥的备份可以采用密钥托管、秘密分割、秘密共享等方式。
密钥托管:
密钥托管要求所有用户将自己的密钥交给密钥托管中心,由密钥托管中心备份保管密钥(如锁在某个地方的保险柜里或用主密钥对它们进行加密保存),一旦用户的密钥丢失(如用户遗忘了密钥或用户意外死亡),按照一定的规章制度,可从密钥托管中心索取该用户的密钥。另一个备份方案是用智能卡作为临时密钥托管。如Alice把密钥存入智能卡,当Alice不在时就把它交给Bob,Bob可以利用该卡进行Alice的工作,当Alice回来后,Bob交还该卡,由于密钥存放在卡中,所以Bob不知道密钥是什么。
秘密分割:
秘密分割把秘密分割成许多碎片,每一片本身并不代表什么,但把这些碎片放到一块,秘密就会重现出来。
秘密共享:
将密钥K分成n块,每部分叫做它的“影子”,知道任意m个或更多的块就能够计算出密钥K,知道任意m-1个或更少的块都不能够计算出密钥K。秘密共享解决了两个问题:一是若密钥偶然或有意地被暴露,整个系统就易受攻击;二是若密钥丢失或损坏,系统中的所有信息就不能用了。
4.1.7 密钥有效期
加密密钥不能无限期使用,有以下有几个原因:密钥使用时间越长,它泄露的机会就越大;如果密钥已泄露,那么密钥使用越久,损失就越大;密钥使用越久,人们花费精力破译它的诱惑力就越大——甚至采用穷举攻击法。
不同密钥应有不同有效期。数据密钥的有效期主要依赖数据的价值和给定时间里加密数据的数量。价值与数据传送率越大所用的密钥更换越频繁。如密钥加密密钥无需频繁更换,因为它们只是偶尔地用作密钥交换,密钥加密密钥要么被记忆下来,要么保存在一个安全地点,丢失该密钥意味着丢失所有的文件加密密钥。
公开密钥密码应用中的私钥的有效期是根据应用的不同而变化的。用作数字签名和身份识别的私钥必须持续数年(甚至终身),用作抛掷硬币协议的私钥在协议完成之后就应该立即销毁。即使期望密钥的安全性持续终身,两年更换一次密钥也是要考虑的。旧密钥仍需保密,以防用户需要验证从前的签名。但是新密钥将用作新文件签名,以减少密码分析者所能攻击的签名文件数目。
4.1.8 密钥销毁
如果密钥必须替换,旧钥就必须销毁,密钥必须物理地销毁。
4.2 公钥基础设施PKI
PKI是一个利用公钥加密技术为密钥和证书的管理,所设计的组件、功能子系统、操作规程等的集合,它的主要任务是管理密钥和证书,为网络用户建立安全通信信任机制。
4.2.1 数字证书
数字证书是一个包含用户身份信息、公钥信息、证书认证中心(CA)数字签名的文件。
作用:数字证书是各类终端实体和最终用户在网上进行信息交流及商业活动的身份证明,在电子交易的各个缓解,交易的各方都需要验证对方数字证书的有效性,从而解决相互间的信任问题。

4.2.2 CA机构
CA全称Certificate Authentication,是具备权威性的数字证书申请及签发机构。
CA作为PKI的核心部分,主要由注册服务器组、证书申请受理和审核机构、认证中心服务器三者组成。
注册服务器:通过 Web Server 建立的站点,可为客户提供24×7 不间断的服务。客户在网上提出证书申请和填写相应的证书申请表。
证书申请受理和审核机构:负责证书的申请和审核。
认证中心服务器:是数字证书生成、发放的运行实体,同时提供发放证书的管理、证书废止列表(CRL)的生成和处理等服务。
通过CA可以实现以下功能:
1. 接收验证最终用户数字证书的申请;
2. 确定是否接受最终用户数字证书的申请和审批;
3. 向申请者颁发、拒绝颁发数字证书;
4. 接收、处理最终用户数字证书的更新;
5. 接受最终用户数字证书的查询、撤销;
6. 产生和发布CRL(证书废止列表);
7. 数字证书的归档;
8. 密钥归档;
9. 历史数据归档;
五、量子密码
5.1 量子计算
由于量子计算技术取得了出人意料的快速发展,大量仅能抵御经典计算机暴力破解的密码算法面临被提前淘汰的困境 。
非对称密码系统有效解决了对称密码面临的安全密钥交换问题,因而广泛应用于公钥基础设施、数字签名、联合授权、公共信道密钥交换、安全电子邮件、虚拟专用网以及安全套接层等大量网络通信活动之中。不幸的是,随着量子计算的发展,包括RSA密码、ECC密码以及DH密钥交换技术等非对称密码算法已经从理论上被证明彻底丧失了安全性。相对于对称密码系统还可以采取升级措施应对量子威胁,非对称密码系统必须采取全新方法进行重建 。
5.2 量子密码
量子密码是以量子力学和密码学为基础,利用量子物理学中的原理实现密码体制的一种新型密码体制,与当前大多使用的经典密码体制不一样的是,量子密码利用信息载体的物理属性实现。目前量子密码用于承载信息的载体包括光子、压缩态光信号、相干态光信号等。
由于量子密码体制的理论基础是量子物理定理,而物理定理是物理学家经过多年的研究与论证得出的结论,有可靠的理论依据,且不论在何时都是不会改变的,因此,理论上,依赖于这些物理定理的量子密码也是不可攻破的,量子密码体制是一种无条件安全的密码体制。
————————————————
版权声明:本文为CSDN博主「gogo_wei」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:
https://blog.csdn.net/gogo_wei/article/details/81879876
密码学基础知识概述
https://blog.csdn.net/Ste_Fan/article/details/89139838