存档

使用 openssl 进行 RSA 加解密

2019/01/18 122

在我之前的一篇博客中 RSA 公钥加密原理 中, 对 RSA 非对称加密原理做了简单的阐述。这篇博客主要聊如何使用 OPENSSL 进行密钥对的生成,以及非对称加解密。

一. 生成密钥对

在 OPENSSL 中, RSA 是一个很重要的结构体。它的定义在 rsa_locl.h 中,面包含了在原理中提到的所有重要的变量 随机质数 p, q, 公钥指数 e, 私钥指数 d, 以及模数 n

生成密钥函数:

  • bits 密钥的规模(modulus)。小于 1028 位的密钥是不安全的,小于 512 则会返回 0
  • e 公开的指数。它应该是一个奇数(odd number), 一般是 3, 1765537
  • cb 生成大随机数的回调函数。一般使用 NULL 即可, 默认为 BN_GENCB_call()

阅读全文…

使用 openssl 进行 AES 加解密

2019/01/08 165

在我之前的一篇博客里介绍了 对称加密的模式 . 这里主要聊一聊如何使用 openssl 来进行 AES 加密 .

一. OPENSSL crypto API

openssl 加密 API 分两个部分: High Level and Low Level . 对于大部分人来说,使用 High Level 就够用了, 这些 API 被冠以 EVP (Envelope) ,表示对 Low Level 的封装。High Level API 提供了包括 对称/非对称加解密签名, 验证, 哈希MAC 等一系列组件,屏蔽了 Low Level API 的复杂逻辑,使用起来安全高效。对于除非有需要进行加密算法级别的改进,否则不建议使用 Low Level API.
大部分 EVP API 有一个 int 型返回值 ,用来表示操作是否成功:1 表示成功, 0 表示失败。但有些时候也会返回 -1 ,表达如内存分配或者其他什么错误。官方指导代码如下:

二. 使用 EVP API 进行 AES 加解密

对于 AES 加解密,EVP API 分为两种,EVP_Encrypt / EVP_Decryp 系列 和 EVP_Cipher 系列。后者是对前者进一步的封装。它们具体使用的套路都是一样的:

  1. 创建加解密上下文 EVP_CIPHER_CTX
  2. 调用 xxxInit() 函数,使用 key(密钥)、iv(前置向量)cipher(算法) 对上下文初始化
  3. 调用 xxxUpdate() 函数进行加解密。该函数支持流式操作。即对于一段明文来说,分成多组按顺序进行加密,和一次性全部加密,不影响其生成的密文的正确性。
  4. 调用 xxxFinal() 函数获取上下文中遗留的信息
  5. 释放上下文, 完成加解密。

阅读全文…

RSA 公钥加密原理

2018/12/10 199

和对称加密不同,公钥加密(非对称加密)的密钥分为加密密钥(公钥)和解密密钥(私钥)。 公钥是公开的,任何人都有可能知道公钥,并用公钥生成密文,而私钥是保密的,只有解密者才能知道私钥,用它来解密密文获得明文。在这里对使用最广泛的公钥密码算法– RSA.
RSA 是发明此算法的三位科学家的姓氏的首字母(吐槽一下:外国人的命名真随意)

一. RSA 加密

在RSA中,明文,密钥和密文都是数字, RSA的加密过程可以用如下公式表达:

$$密文 = 明文^E  \mod N$$

即: RSA  的密文是明文的 $E$ 次方求模 $N$ 的结果, 或者说,密文是明文的 $E$ 次方除以 $N$ 的余数。这就是整个加密过程,它非常简洁。因此,如果知道了 $E$ 和 $N$ ,那么任何人都可以进行加密运算,也就是说,

$$ E 和 N 是公钥$$

在实际使用中, E 和 N 是经精心计算的数字。

二. RSA 解密

RSA 解密公式如下:

$$ 明文= 密文^D \mod N$$

即,对密文的 $D$ 次方求模 $N$ 运算,就可以得到明文。这里是

$$D 和 N 是私钥 $$

阅读全文…

Diffie-Hellman 密钥交换

2018/12/02 234

在使用对称加密中,有一些无法避免的问题:

  • 密钥如何从加密方传递给解密方。窃听者如果可以劫获密文,那么也可能劫获密钥。
  • 如果窃听者破解了密钥,加密方如何将新的密钥安全地交给解密方

1. DH 密钥交换

解决上述问题的一种方法就是 DH 密钥交换 技术 。
DH 密钥交换全称为 Diffie-Hellman 密钥交换 ,是1976年由 Whitfiedl Diffle 和 Martin Hellman 共同发明的一种算法。使用这种方法,通信双方可以在窃听者眼皮子底下来安全地传输密码。
DH 交换的步骤如下:

阅读全文…

Windows 如何修改系统盘符

2018/11/13 245

在使用 Win10 开发近 5 年的时间里,我填了各种各样的坑。最近终于受不了,将办公室里的开发机器的操作系统换回 Win7 。但是在重装 Win7 系统后,发现了一个问题:Win7 系统盘符并不是 C:/ 而是 F:/ 。这导致有些软件不能使用了。在网上找了一通后,找到如下办法可以将系统盘符换回 C:/ :
修改 HKEY_LOCAL_MACHINE\SYSTEM\MountedDevice\DosDevices\F: 的键名为 \DosDevices\C:
重启以后,发现系统盘符果然改成了 C:/ 。然而,系统无法正常使用:无法加载用户配置文件、无法打开系统应用,甚至连资源管理器都无法打开!
这个时候如果想将注册表改回去,发现
无法打开 C:/windows/regedit.exe, 找不到指定文件
经过一通谷狗之后,有如下解决办法:

1. 恢复到之前的盘符

使用 PE 引导盘,进行系统后打开 regedit.exe ,但是这个时候修改HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices 是无效的,因为此时的注册表是 PE 系统的注册表,而不是 Win7 的注册表。应该想办法加载 Win7 的注册表,方法如下:
将鼠标定位在 HKEY_LOCAL_MACHINE\ 上,选择菜单 文件 -> 加载配置单元 , 在对话框中选择 F:\Windows\System32\config\SYSTEM ,在新加载的注册表项里找到 MountedDevices, 将 \DosDevices\C: 改加 \DosDevices\F: ,并重启。
因为 regedit.exe 只是注册表编辑器,真正的注册表文件存储在 F:\Windows\System32\config\SYSTEM 里。

2. 解决盘符的问题

在注册表里搜一下 F:/ ,发现实在太多了。这决定里通过修改盘符不能解决问题而只会引发更多的问题。冷静下来思考了一下,想到如果使用磁盘映射可能可以解决问题:
首先,查看是否有磁盘占用了 盘符 C,如果有,则改之。
然后,cmd 下使用 subst 命令:

此时发现 “我的电脑” 中果然出现了 C 盘且和 F 盘一毛一样。至此问题得到解决。

3. 改进

这种方法的缺点就是,该命令在重启后会失效。所以需要在启动时自动运行。我选择将其加入到 Windows 计划任务库里

附:subst 命令

  • 命令基本格式 > subst [盘符] [路径]
  • 查看所有映射 > subst
  • 解除某个映射 > subst [盘符] /D

浅析 HTTPS (SSL/TLS) 握手协议

2018/10/10 552

超文本传输安全协议 (HTTPS, Hypertext Transfer Protocol Secure) 常称为HTTP over TLS,HTTP over SSL或HTTP Secure, 是一种使用计算器网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。
传输层安全性协议 (TLS, Transport Layer Security) ,及其前身 安全套接层(SSL,Secure Sockets Layer)是一种安全协议,目的是为互联网通信,提供安全及数据完整性保障。网景公司推出HTTPS协议时,以SSL进行加密,这是SSL的起源。IETF将SSL进行标准化,1999年公布第一版TLS标准文件。随后又公布RFC 5246 (2008年8月)与 RFC 6176 (2011年3月)。TLS/SSL 不仅为浏览器提供支持,在邮箱、即时通信、VoIP、网络传真等应用程序中也得到广泛应用。
由此可知,HTTPS 是在 SSL/TLS 之上承载 HTTP 。与HTTP 不同,HTTPS 使用 https:// 做为URL前缀, 默认端口为 443.
为方便,后面将 SSL/TLS 简写为 TLS.

 

协议的层次

TLS 协议为由 TLS记录协议(TLS record protocol)TLS握手协议(TLS handshake protocol) 这两层协议叠加而成。记录协议负责进行加密,握手协议负责进行加密之外的其它操作。

 

  1. TLS记录协议 位于握手协议的下层,负责对消息进行加密。它使用了对称加密和消息认证,但具体的算法和共享密钥则是通过握手协议在服务端和客户端之间协商决定的。
  2. TLS握手协议 分为4个子协议
    • 握手协议 负责在客户端与服务端之间协商决定密码算法和共享密钥。基于证书的认证操作也是在这个协议中完成。在握手协商一致后,双方会互发信号来切换密码。
    • 密码规格变更协议 负责向通信对象传达密码变更的信号。
    • 警告协议 负责在发生错误时将错误信息传递给对方。如果没有发生错误,接下来会使用应用数据协议进行通信。
    • 应用数据协议 负责将TLS 上面承载的应用数据传达给通信对象

阅读全文…