为什么要使用消息认证码(MAC)而非对称密钥?
问题:
看了消息认证码的介绍后,小丽心想“如果用对称密码将消息加密后再发送的话,是不是就不需要消息认证码了呢?”原因有下:
1.对称密码的密文只有使用和加密时相同的密钥才能正确解密;
2.如果解密密钥和加密密钥不同,解密之后也只能得到“看上去随机的杂乱消息”;
3.因此,只要解密之后得到的明文是正确的,就可以知道这条消息室由持有相同密钥的发送者加密的;
4.也就是说,只用对称密码就可以实现和消息认证码相同的功能。
请问小丽的想法正确吗?
解答:
小丽的想法部分正确,但并非完全正确。
的确,使用对称密码来对消息进行认证是可能的,实际上也存在这样的方法,但是这样的方法是有局限性的。
假设我们要发送的明文就是随机的比特序列,我们将明文用对称密码加密之后发送出去,当接受者收到密文并进行解密时,明文看上去就是一串随机的比特序列。那么这段密文是来自正确的接受者呢?还是来自不正确的发送者呢(伪装的发送者)呢?
“正确的发送者用正确的密钥加密的随机比特序列”和“不正确的发送者用错误的密钥加密的任意比特序列”,两者在解密后看上去都是随机的比特序列,因此无法对它们进行区别。
小丽的思考过程1~4中,3中的“解密之后得到的明文是正确的”这一点是有问题的。要判断“解密之后得到的明文是正确的”,就需要明文具备某种特定的结构(如存在头尾,或者是像英文文章一样存在概率偏向)。
注:这里的“看起来随机”是指对解密者而言。举一个例子:商品的数量为255,小丽对明文FF加密后得到L8F31,小明解密后得到FE,但小明并不能确认FE就是被篡改过后得到的明文,因为这个结果也在明文空间里。
如果使用消息认证码,即便发送的是随机比特序列,我们也能够正确地对消息进行认证。
本质上来说,就是将消息完整性的认证从预定结构的正确性判断抽象到消息认证码单项散列函数的抗碰撞的性质上,从而使得消息本身可以使用任意结构;同时可认证性使用共享密钥保证。
题目来自:
《图解密码技术》第三版
https://zh.wikipedia.org/wiki/%E8%A8%8A%E6%81%AF%E9%91%91%E5%88%A5%E7%A2%BC
为什么要使用消息认证码(MAC)而非对称密钥?的更多相关文章
- 消息认证码 - MAC (Message Authentication Code)
消息认证包括两个目标 1消息完整性认证: 确保张三发给我的消息是完整的,在传输过程中没有被第三方篡改 2消息的来源认证: 确保这个数据是张三发给我的,而不是李四发给我的 第一个目标通常使用散列函数来达 ...
- 密码学奇妙之旅、03 HMAC单向散列消息认证码、Golang代码
HMAC 单向散列消息认证码 消息认证码MAC是用于确认完整性并进行认证的技术,消息认证码的输入包括任意长度的消息和一个发送者和接收者之间共享的密钥(可能还需要共享盐值). HMAC是使用单向散列函数 ...
- Algorithm:Java加密解密之MAC(消息认证码)
MD5 消息摘要(数字摘要) 它是把一个文本/文件 通过摘要函数(hash函数)计算出一个结果.然后把文本/文件和摘要结果一同发给接受者接受者接收到文件之后,也进行摘要,把两个摘要结果进行对比.如果一 ...
- 密码学初级教程(五)消息认证码MAC-Message Authentication Code
密码学家工具箱中的6个重要的工具: 对称密码 公钥密码 单向散列函数 消息认证码 数字签名 伪随机数生成器 MAC能识别出篡改和伪装,也就是既可以确认消息的完整性,也可以进行认证. 消息认证码的输入包 ...
- 29.密码学知识-消息认证码MAC-6——2019年12月19日
1. 消息认证码 1.1 消息认证 消息认证码(message authentication code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC. 思考改进方案? 从哈希函数 ...
- hmac库 密钥相关的哈希运算消息认证码
# -*- coding: cp936 -*- #xiaodeng #python 2.7.10 #HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一 ...
- HMAC哈希消息认证码
收藏 137 14 hmac 编辑 HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出. 中文名 哈希消息认证码 外文名 H ...
- MAC (Message Authentication Code,消息认证码算法)
需要将密钥发送到对方,对方用该密钥进行摘要处理,进行摘要验证. //初始化KeyGenerator KeyGenerator keyGenerator= KeyGenerator.getInstanc ...
- 转: MAC认证码的说明
转: http://blog.sina.com.cn/s/blog_4940e1fc01012vk3.html MAC(Message Authentication Code) 消息认证码(带密钥的H ...
随机推荐
- Linux常用配置讲解
本文主要讲解Linux的用户设置.主机名设置.网络配置.防火墙配置 用户传输包的命令lrzsz的安装以及SSH服务配置等基本操作. 1. 用户名设置 服务肯定是为了用户,而用户可能对于Linux并不了 ...
- Set的常用方法(java)
一.新增:重复新增的值会被覆盖 代码: Set<String> ss=new HashSet<String>(); ss.add("a");ss.add(& ...
- python列表的一些常用方法以及函数
学习到了一些关于python列表的新知识,自己整理了一下,方便大家参考: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # File_type:列表的常用操 ...
- node.js安装——Windows7系统下的安装及其环境部署——特别详细
作为一个前端的菜鸟同学,之间也没学过什么框架,目前公司做项目,所用到的webpack+node.js+vue. 首先,关于node的环境部署方面,建议官网安装node.js,最好不要安装非稳定版的版本 ...
- 使用JavaMail发送带附件的邮件
所需jar包 链接:http://pan.baidu.com/s/1dFo4cDz 密码:akap 工具类: package com.javamail.utils; import java.util. ...
- SQL Server 分页技术(存储过程)
alter proc proc_getpage ), )='*', ), )='asc', @pagesize int , @pageindex int, )='' as begin declare ...
- cocos2dx3.0导出自定义类到lua的方法详细步骤
我写了一个用3.0的工具导出类到lua,自动生成代码的方法. 以前要导出c++类到lua,就得手动维护pkg文件,那简直就是噩梦,3.0以后就会感觉生活很轻松了. 下面我就在说下具体做法.1.安装必要 ...
- makefile 中=与:=的差别
1."=" make会将整个makefile展开后,再决定变量的值.也就是说,变量的值将会是整个makefile中最后被指定的值.看例子: x = foo y = $(x) bar ...
- mysql主从复制笔记
一:测试环境介绍 主从复制测试环境是ubuntu+mysql5.7,master服务器ip是192.168.71.135,slave服务器ip是192.168.71.137,ubuntu环境是从一台已 ...
- 深入理解javascript函数进阶系列第一篇——高阶函数
前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数 ...