OpenSSL编程-RSA编程详解

一. RSA PEM文件格式 1. PEM私钥格式文件 2. PEM公钥格式文件 3. PEM RSAPublicKey公钥格式文件 二. OpenSSL密钥相关命令 1. 生成密钥 2. 提取PEM格式公钥 3. 提取PEM RSAPublicKey格式公钥 4. 公钥加密文件 5. 私钥解密文件 三. RSA相关API 1. 基本数据结构 2. BN大数系列函数 3. RSA系列函数 4. PEM系列函数 5. RSA加密API 6. RSA解密API 四. RSA编程示例 1. 数据加、密解密示例 2. PEM/BIGNUM公钥转换示例 3. 密钥生成示例

[阅读全文...]

OpenSSL编程-非对称加密及RSA简介

一. 对称与非对称加密 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。对于加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。常用的对称加密算法有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等 与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密 […]

[阅读全文...]

OpenSSL编程-3DES编程详解

一. 3DES加密原理 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。 3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代 […]

[阅读全文...]

邮件服务器-电子邮件系统架构设计及介绍

1. 背景 Email和BBS服务应该是互联网最古老的两大网络应用,伴随着Internet的发展,两大应用也都产生着各自的变化,很多网络应用服务也都是从这两大应用演化而来,然后电子邮件系统也进行着自身的演化,从最早的机构内部系统慢慢演化到面向免费个人用户的超级系统,又逐渐进入企业级服务领域,满足着企业级的多种业务需要。 在电子邮件系统开发领域做了10年之久,经历了几代WebMail体系开发变化,亲自完成了全新一代MTA引擎的开发,回想起整个电子邮件系统的方方面面,让人觉得其中还有无数可以让人继续为之努力的方向,而且很多部分可能在接下来的几年仍然会有很大的颠覆变化。可能不太熟 […]

[阅读全文...]

OpenSSL编程-DES编程详解

一. DES加密原理 DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位(每组的第8位作为奇偶校验位),产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 轮循环,使用异或,置换,代换,移位操作四种基本运算。 二. DES API 1. 基本数据结构 2. 基本宏定义 3. 设置密钥函数 4. DES ECB模式加解密API 5. DES CBC模式加解密 […]

[阅读全文...]

OpenSSL编程-对称加密及DES/3DES简介

一. 对称加密算法 对称加密算法使用一个密钥,对给定的明文进行加密,产生密文与原明文大致相同,同时使用此密钥对所产生密文进行解密。主要分为四种加密模式: 1. 电子密码本模式 Electronic Code Book (ECB),将加密的数据分成若干组,每组大小跟加密密钥长度相同,然后分别对每组都用相同的密钥进行加密。其缺点是明文中存在重复的数据块,产生的密文也会重复,所以只能用于小块数据加密。 2. 加密块链模式 Cipher Block Chaining (CBC),将明文分成固定长度的块,然后将前面一个加密块输出的密文与下一个要加密的明文块进行异或操作,将计算结果再用 […]

[阅读全文...]

C语言编程规范

1. 背景 无论如何,标准是团队开发的保证之一,而且标准欢迎争吵和变化。我们使代码易于管理的方法之一是增强代码一致性,让别人可以读懂你的代码是很重要的,保持统一编程风格意味着可以轻松根据“模式匹配”规则推断各种符号的含义。创建通用的、必需的习惯用语和模式可以使代码更加容易理解,在某些情况下改变一些编程风格可能会是好的选择,但我们还是应该遵循一致性原则,尽量不这样去做。 2. 环境 统一开发人员的开发环境,包括文本编辑环境、SHELL环境,通常我们使用VIM的UTF-8编码环境,使用4个空格代替Tab进行缩进。 3. 命名 头文件(.h 文件)和程序文件(.c文件)文件名全部 […]

[阅读全文...]

生产环境优雅的重启基于Nginx、Tornado的Web服务进程

Nginx是一个高效的Web服务器及代理服务器,Tornado是一个基于epoll的异步Web开发框架,通常使用Nginx做为Web服务器时,都会以FastCGI模式,而我们从开发、调试、运维的角度考虑,使用了反向代理的模式,同时Nginx可以做一些特殊业务和负载均衡的处理。 其实反向代理模式很简单,Nginx监听在80端口,做为Web服务端口,而Tornado的Web服务进程监听在808*的内部端口(可以启动多个进程),使用supervisor对Nginx、Tornado服务进程进行统一的管理。 首先看supervisor的配置: 启动脚本(可以放到start.sh中): […]

[阅读全文...]

C语言算法-单链表的反转/逆序算法

平时的工作中通常会使用双链表进行链式的数据存储或是一些更高级的数据结构的构建(比如:栈、队列等),双向链表的正向、逆向遍历已经非常容易,而且系统库已经为我们构建好了非常高效的链表对象,比如著名的Linux内核链表对象:struct list_head,提供了非常丰富的链表操作方法。 如果从单纯的数据结构、算法实现角度讲,单链表也有很多值得研究的地方,今天介绍两种对单链表进行反转/逆序的算法: 1. 原地进行节点的反转/逆序 2. 从第三个节点开始,依次插入到头结点之后,并再将头节点移动到表尾 链表结构的定义,采用最简单的方式,数据单元直接采用整数对象进行数据存储,并且采用无 […]

[阅读全文...]

降低Nginx代理服务器的磁盘IO使用率,提高转发性能

目前很多Web的项目在部署的时候会采用Nginx做为前端的反向代理服务器,后端会部署很多业务处理服务器,通常情况下Nginx代理服务器部署的还是比较少,而且其以高效性能著称,几万的并发连接处理速度都不在话下。 然而去年的时候,我们的线上系统也采用类似的部署结构,同时由于我们的业务需求,Nginx的部署环境在虚拟机上面,复用了其他虚拟机的整体磁盘,在高IO消耗的场景中,我们发现Nginx的磁盘写入消耗还是很明显的,而且到了影响其他服务的情况。 发现问题的过程很曲折,开始的时候我们并没有怀疑到是Nginx的问题,一直在排查我们的业务处理服务程序,检查为什么会带来如此多磁盘消耗, […]

[阅读全文...]