昨天在对接实名制管理平台时,再次遇到加密算法的问题,想了想还是写篇文章沉淀下来。
可以看到这里写了AES加密--高级加密标准(AES,Advanced Encryption Standard),还附有算法说明。加密算法,我们狐友在对接其它语言开发的接口就一定会遇到。那是加菲猫来讲讲怎么做这种对接接口加密。
它是一种对称加密算法。何谓对称,对称就是加密和解密用的密钥是相同的,就像家里的门,各把钥匙的是一样的,就可以打开这个门,所以钥匙千万不能丢。
做加密算法,最重要的是验证加密后的结果对不对,所以我们要找到验证的方法。
加菲猫在找到一个可以做验证的网站。
http://tool.chacuo.net/cryptaes
可以看到选项很多,看起来复杂。
AES加密模式有多种:ECBCBCOFBCTRCFB,上方的文档写的是CBC。
文档中的数据块就是PKCS7模式,就对应上图的填充选项。
BLOCKSIZE 128就是指数据块128位。
字符集是UTF-8,如果涉及到中文,就要更改页面中的字符集。
密码和偏移量IV在文档都会给到。
输出是BASE64编码。
于是我们就可以试试这个加密工具了。
加密模式 CBC ,填充PKCS7,数据块128位,密码:0123456789ABCDEF,偏移量:0123456789ABCDEF
接下来用VFP来做加密。
加菲猫找到一个非常好用的FLL类库,里面封装了非常多的加密算法。
代码语言:javascript复制 lccorpstr=Strconv("加菲猫的VFP",9) &&要转UTF8
lcappsecret="0123456789ABCDEF"
Set Library To vfpencryption71.fll Additive
lcIv=lcappsecret
lcAES=Encrypt(lccorpstr,lcappsecret, 0, 1, 2, Len(lcappsecret), 16, m.lcIV)
lccorpsign=Strconv(lcAes,13) &&输出结果要转BASE64
Release Library vfpencryption71
?lccorpsign
输出
代码语言:javascript复制 Qp/RA1zU6wB4NjmZ/YMWg==
返回值:
字符型 - cStringtoEncrypt 的加密版本。
结果一致,加密算法没问题,可以进入正式开发了。
Encrypt函数有很多参数,都是对应页面中的那些选项,具体大家看文档了。
函数:ENCRYPT()
声明: Encrypt(cStringtoEncrypt, cSecretKey[, nEncryptionType[, nEncryptionMode[, nPaddingType[, nKeySize[, nBlockSize[, cIV]]]]]])
参数:
cStringtoEncrypt - 你想加密的明文字符串,例如“Hello World!”。
cSecretKey - 你想在加密过程中使用的明文字符串 Key,例如“My_SeCrEt_KeY”。请注意,key 针对特殊的加密类型或许需要特定的长度。更多信息请参看后面的内容。
nEncryptionType - 共有5种可用的加密方式。这个参数的值用来确定使用哪种类型,并且确定 Secret Key 的长度。在 Visual FoxPro 中,一个单字符等于 1 字节(或 8 位)。所以,一个加密算法如果需要一个 128 位的 Key ,那么就需要 Secret Key 是一个具有16个字符的字符串(16 x 8 = 128)。 0 = AES128 (需要一个 16 个字符的Key) 1 = AES192 (需要一个 24 个字符的Key) 2 = AES256 (需要一个 32 个字符的Key) *参数的默认值 4 = Blowfish (需要一个 56 个字符的Key) 8 = TEA (需要一个 16 个字符的Key) 1024 = RC4 (Key 可以是任意长度)
nEncryptionMode - 针对上面列出的加密类型一共有三种可用模式。它们是:Electronic Code Book (ECB)、Cipher Block Chaining (CBC) 和 Cipher Feedback Block (CFB) 。参数nEncryptionMode 不能应用于 RC4 加密(nEncryptionType = 1024)。
0 = ECB *参数默认值 1 = CBC 2 = CFB
3 = OFB
nPaddingType填充模式
0 = Zeroes (NULLs) *Default
1 = Spaces (blanks)
2 = PKCS7
3 = ANSI X.923
4 = ISO 10126
nKeySize - 密钥长度
nBlockSize - 填充长度
cIV - 偏移量