WEP加密报文如下,其加密密钥为ASCII字符串:12345

将报文以十六进制显示,红色表示加密部分
0010  00 11 22 33 44 55 10 00  00 00 3C FC BF 00 9A 6E
0020  50 1D C4 2D 3D 6B B1 55  FD DB D9 2F 9F EB 81 5F
0030  A0 53 E2 DD CD E5 25 83  E9 87 98 D1 70 2E 55 8A
0040  9D A9 21 35 FF 09 E8 03  0E 77 DD F9 8D 5C 0A 78
0050  E8 C6 08 76 99 BD 6F BF  75 48 4F BD 5D 76 C5 F9
0060  3D A5 5D BA EE DD
具体加密过程见下图 -- 引用自 Wikipedia(加上评注)

上图说明,将报文中的 Initialization Vector 字段和 WEP 密钥(连接后)作为 RC4 算法的密钥种子,生成密钥码流,再逐个与明文异或,就得到密文
现在已知报文密钥,剩下就是利用工具对其解密得到明文—这里我们继续利用 OpenSSL

OpenSSL 的 enc 命令支持 rc4 算法,其 -K 选项后跟 RC4 密钥种子,对应上图中的 seed
不过在使用前,需要改动一点代码,因为 enc 命令强制使用固定长度的 seed(实际 RC4 允许变长的 seed),具体为
    rc4                128 bit
    rc4-40             40 bit

如果 -K 选项指定的 seed 长度不足,则会用零补齐,凑够固定长度,如下
C:\>openssl rc4 -K ABC -iv 0 -nosalt -e -nopad -P
key=ABC00000000000000000000000000000

如果 seed 超出固定长度,则截短为固定长度
C:\>openssl rc4 -K 0123456789ABCDEF0123456789ABCDEF0 -iv 0 -nosalt -e -nopad -P
key=0123456789ABCDEF0123456789ABCDEF

以上使用 -P 选项打印实际的 key(其实是 seed)

这里 RC4 密钥种子为 Initialization Vector||WEP Key = 0x3cfcbf3132333435,为 64 位,会被补零,造成解密错误

怎么改呢?只要修改文件 crypto\evp\e_rc4.c,如下,将 EVP_CIPHER_CTX_key_length(ctx) 改为 strlen(key)

static int rc4_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,const unsigned char *iv, int enc)
{RC4_set_key(&data(ctx)->ks, /*EVP_CIPHER_CTX_key_length(ctx)*/ strlen(key),key);return 1;
}

需要指出,这只是临时的 Workaround,它会影响 -k(小写) 选项:OpenSSL 内部会先调用 EVP_BytesToKey 函数进行 Key Derivation
随后在 rc4_init_key 函数中,RC4_set_key 的入参会发生变化。感兴趣可以调试跟踪一下
顺带说下,EVP_BytesToKey 不兼容标准的 PBKDF2(参见 RFC2898)

运行修改版本的 OpenSSL
C:\>openssl rc4 -K 3cfcbf3132333435 -iv 0 -nosalt -e -nopad -p -in wep_cipher.txt -out wep_plain.txt
key=3CFCBF31323334350000000000000000

wep_cipher.txt 文件内容如下
00000000h: 9A 6E 50 1D C4 2D 3D 6B B1 55 FD DB D9 2F 9F EB
00000010h: 81 5F A0 53 E2 DD CD E5 25 83 E9 87 98 D1 70 2E
00000020h: 55 8A 9D A9 21 35 FF 09 E8 03 0E 77 DD F9 8D 5C
00000030h: 0A 78 E8 C6 08 76 99 BD 6F BF 75 48 4F BD 5D 76
00000040h: C5 F9 3D A5 5D BA EE DD

wep_plain.txt 文件内容如下
00000000h: AA AA 03 00 00 00 08 00 45 00 00 3C 7A 8C 00 00
00000010h: 80 01 3C CC C0 A8 01 16 C0 A8 01 02 00 00 86 56
00000020h: 02 00 CD 05 61 62 63 64 65 66 67 68 69 6A 6B 6C
00000030h: 6D 6E 6F 70 71 72 73 74 75 76 77 61 62 63 64 65
00000040h: 66 67 68 69 42 74 BA 61

究竟明文是什么报文呢?我们可以使用 wireshark(本例为版本 1.8.6)查看,前提是添加解密密钥,如下
菜单【Edit】-->【Preferences】,选 IEEE 802.11 --> Edit

下图为 wiresharek 显示的明文

原来是 ICMP ping 报文

有两个地方需要注意
1、wireshark 显示明文长度为 68 字节,少了 wep_plain.txt 后面的 4 个字节(见上面蓝色4字节),原因是 WEP 使用 CRC32 来校验明文的完整性
实际上 CRC 结果是明文的一部分,只是没有显示在解密窗口中
可以利用 perl 自带的 crc32.bat 脚本(位于 perl\bin 目录)进行验证,命令结果为 61ba7442(字节序恰好与 42 74 BA 61 相反)
2、在IP层下方还有一层 Logical-Link Control,与常见的以太报文相比,这是 WiFi 报文的特殊之处

另外,较新版本(>=1.8.6)的 wiresharek 提供了工程文件 wireshark.vcproj,这样就可以直接在 VC 中进行编译、调试

最后考虑一下 WEP 的安全性,这里用 4 个字母缩写表示主要考虑的安全指标:SCIA,后续对安全协议将使用这些指标进行衡量,解释如下
Signature —— 签名(即对方不能否认发出的消息)
Confidentiality —— 机密(数据被加密)
Integrality —— 完整(加密数据解密后,可以知道是否受到有意无意的损坏)
Authentication —— 认证(能够识别对方的真实身份)
其他还有一些安全指标,比如授权、可用/可靠性、行为审计等,不再考虑,本文聚焦在密码学意义上的安全指标

WEP 提供了数据的机密和完整性保证,由于是对称算法,原则上无法识别对方身份(一个 AP 通常由多个无线终端共享一个 WEP 密钥接入,无法区分谁是谁),不可否认也谈不上。(事实上 WEP 是有认证之说的,分为 Open System 和 Shared Key 两种,但都不符合前面提到的强认证,即识别对方的真实身份)
我们要记住的是,WEP 已经不安全了(现在已经有诸多针对它的攻击工具,参见http://www.backtrack-linux.org/),尽量不要使用,
应该使用更安全的 wpa/wpa2/wpa-psk/wpa2-psk 方式

为什么不安全,由于涉及广泛,一篇文章无法覆盖完全,本文不再说明。

转载于:https://www.cnblogs.com/efzju/archive/2013/06/12/3018661.html

安全协议系列(一)----WEP详解相关推荐

  1. Docker系列07—Dockerfile 详解

    Docker系列07-Dockerfile 详解 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作  dockerfile,docker build 基于容器制作镜像,已经在上篇Do ...

  2. 小猫爪:i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解

    i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解 1 前言 2 FlexCAN简介 2.1 MB(邮箱)系统 2.1.1 正常模式下 2.1.2 激活了CAN FD情况下 2. ...

  3. 网络架构系列1--TCP/IP详解

    不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨-[https://blog.csdn.net/cjm2484836553/article/details/103930596] <网 ...

  4. ARP协议及ARP欺骗详解

    ARP协议及ARP欺骗详解 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议.主机发送信息时将包含目标IP地址的ARP ...

  5. HTTP协议的头信息详解

    HTTP协议的头信息详解 http://blog.csdn.net/guoguo1980/archive/2008/07/14/2649658.aspx HTTP协议的头信息详解 HTTP(Hyper ...

  6. mongo 3.4分片集群系列之六:详解配置数据库

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  7. ftm模块linux驱动,飞思卡尔k系列_ftm模块详解.doc

    飞思卡尔k系列_ftm模块详解 1.5FTM模块1.5.1 FTM模块简介FTM模块是一个多功能定时器模块,主要功能有,PWM输出.输入捕捉.输出比较.定时中断.脉冲加减计数.脉冲周期脉宽测量.在K1 ...

  8. React Native按钮详解|Touchable系列组件使用详解

    转载自:http://www.devio.org/2017/01/10/React-Native按钮详解-Touchable系列组件使用详解/ 在做App开发过程中离不了的需要用户交互,说到交互,我们 ...

  9. [转]HTTP协议之状态码详解

    HTTP协议之状态码详解 HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果是做AJ ...

  10. Material Design系列之BottomNavigationView详解

    Material Design系列之BottomNavigationView详解 Material Design官方文档Bottom navigation的介绍 BottomNavigationVie ...

最新文章

  1. 互联网+创新时代,“智慧工地”助力武汉城市建设!
  2. 代码重构的实战经验和那些坑
  3. 一张图告诉你BCH路线分歧的现状
  4. [BTS]使用BizTalk开发应用系统,就是这么简单!
  5. 用implicit和explicit打通两种类型
  6. 类中的静态成员函数访问非静态成员变量
  7. 暴露的全局方法_史上最便捷搭建 ZooKeeper 服务器的方法
  8. linux系统冒号模式map怎么用,shell中冒号 : 用途说明
  9. Keras之模型拼接
  10. discuz mysql语句_discuz 数据库插入
  11. OpenCasCade——将鼠标点的位置转换为基于OCC三维坐标系中在某一面上的坐标
  12. bzoj5145 [Ynoi2018]未来日记 (多校第4场1013 Yuno and Claris)
  13. matlab复信道化滤波器组,宽带数字信道化EDA设计
  14. MC(monitorcat) 监控军刀
  15. 构筑企业供应链高效协同优势,智能供应链系统助推汽车服务行业数字化订单管理
  16. linux php-fpm 配置文件,linux下php-fpm开启与关闭方法
  17. echars自定义y轴为图片
  18. Vue实现底部导航栏切换页面及图片
  19. 6000字总结MySQL最基础的增删查改命令
  20. 超详细总结,带你实现 Linux 命令自由

热门文章

  1. 官方蓝牙4.0基本概念
  2. 【原创】改进的大马webshell,过市面上任何防护
  3. Linux cat命令学习
  4. window时间同步
  5. ICDE-2020 论文简析:空间众包中的预测任务分配 : 一种数据驱动的方法 Predictive Task Assignment in Spatial Crowdsourcing
  6. 新装服务器、虚拟机应该做什么
  7. 教你cad版本怎么用转换器转换操作
  8. docx-templates前端模板引擎生成word
  9. pdf压缩大小,一个简单的pdf压缩方法
  10. 一个段子来解释数据挖掘