Openssl与加解密
一、Openssl
Openssl提供了市面上主流的加解密算法实现。这里先介绍下加密和Hash(散列):
- 对称加密
- 非对称加密
- 散列
对称加密:对称密钥密码对加密和解密使用同一个密钥。 包括AES、Blowfish、Camellia、SEED、CAST-128、DES、IDEA、RC2、RC4、RC5、Triple DES、GOST 28147-89。
非对称性加密:非对称性加密有不同的密钥,私钥(private key)和公钥(public key)。 包括:RSA、DSA、Diffie–Hellman key exchange、 Elliptic curve、GOST R 34.10-2001。
散列算法:散列算法也称 Hash(哈希)算法,是一种将任意长度的消息压缩到某一固定长度(消息摘要)的函数,该过程是不可逆的,即不可能通过散列加密后的的结果逆向得出原始的信息。 包括:MD5、MD2、SHA-1、SHA-2、RIPEMD-160、MDC-2、GOST R 34.11-94。
Ruby提供的openssl模块可以满足主流的加密。以RC4为例:
#加密
require 'openssl'
def rc4_encrypt(message)
rc4 = OpenSSL::Cipher::Cipher.new("RC4")
rc4.encrypt
rc4.key = RC_KEY
rc4.update(message)
e << rc4.final
# Make it purdy. Useful for database storage.
e.unpack("H*")[0]
end
#解密
def rc4_decrypt(message)
rc4 = OpenSSL::Cipher::Cipher.new("RC4")
rc4.decrypt
rc4.key = YIXIN_RC_KEY
rc4.padding = 0
rc4.update(message)
end
二、Base64
Base64: 一种基于64个可打印字符来表示二进制数据的表示方法, 使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。
网络传输中加解密一般都要求以Base64的格式传输数据,所以一般加密之后都要先转成Base64.解密的时候则先decode回来。 Base64代码:
def strict_encode(bin)
[bin].pack("m0")
end
另外值得一提的是,网络传输比如url里面的参数一般都会做utf-8编码,有时候返回的数据也会是utf-8编码,而这些编码就会变成十六进制,但本地语言又不直接接受,则需要重新转回本地语言的编码方式, 所以在网络传输是要进行预编码escape,将某些字符被替换成了十六进制的转义序列(除去ASCII字母和数字以及公用的字符),这样所有的计算机语言都能接受。 反之,需要反编码传回的数据,所以有了CGI.unescape(data, CGI::Encoding::UTF_8))这样的函数做utf8 to native encoding。
def utf8_to_native(data)
CGI.unescape(data, CGI::Encoding::UTF_8))
end
Authors and Contributors
Qiqidone (@qiqidone) can be founded GitHub.