您当前的位置: 首页 > 解决方案

微信小程序及各种平台对接常用可逆加密算法aes256

  • 作者: admin
  • 发布于 2018-10-15 14:00:06
  • 来源:  
  • 栏目:解决方案

导语: 不同程序之间经常会交换数据,我们经常采用的套路是: 假设要传输的信息是json,我们假设其为json_data,通过http传递信息为

 

不同程序之间经常会交换数据,我们经常采用的套路是:

假设要传输的信息是json,我们假设其为json_data,通过http传递信息为

json_data_encode=json_data&sign=md5(json_data+key)

接收方通过验证sign就知道内容有没有被篡改.

但是,这样json_data作为明码传送会让我们不太开心,所以今天的我们要介绍的aes256出马了,他是一强度很高的可逆加密算法!

aes256加密出来的内容是二进制的,不好通过http协议传输,所以我们再配合上base64转成ascii码

加密前,aes256要求字节数必须是32字节的倍数,所以使用pkcs7进行填充可以解决问题..介绍完原理,直接贴代码

写了3个版本,openresty及python和php的...请查收

 
  1. local aes = require 'resty.aes'
  2. local base64_encode = ngx.encode_base64
  3. local base64_decode = ngx.decode_base64
  4.  
  5. local key = "a12e93c9edadeaa47eb1aeabe27dabef"
  6. local iv = "a12e93c9edadeaa4"
  7. -- AES 128 CBC with IV and no SALT
  8. local cipher = aes.cipher(256,"cbc")
  9. local aes_256_cbc_with_iv = aes:new(key,nil,cipher,{iv=iv})
  10.  
  11. local function decrypt(input)
  12. input = base64_decode(input)
  13. input = aes_256_cbc_with_iv:decrypt(input)
  14. -- 取最后一个字符的ascii
  15. --local padding = string.byte(input,-1)
  16. --return string.sub(input,-padding)
  17. return input
  18. end
  19.  
  20. local function pkcs7_padding(text)
  21. local text_length = string.len(text)
  22. local amount_to_pad = 32 - (text_length % 32)
  23.  
  24. if amount_to_pad == 0 then
  25. amount_to_pad = 32
  26. end
  27. local pad = string.char(amount_to_pad) return text .. string.rep(pad,amount_to_pad)
  28. end
  29.  
  30. local function encrypt (text)
  31. text = pkcs7_padding(text)
  32. text = aes_256_cbc_with_iv:encrypt(text)
  33. return base64_encode(text)
  34. end
  35.  
  36. print(decrypt(encrypt('linbc')))

接着是python版本的

 
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import base64
  5.  
  6. from Crypto.Cipher import AES
  7.  
  8.  
  9. import binascii
  10. import StringIO
  11.  
  12. class PKCS7Encoder(object):
  13. '''
  14. RFC 2315: PKCS#7 page 21
  15. Some content-encryption algorithms assume the
  16. input length is a multiple of k octets, where k > 1, and
  17. let the application define a method for handling inputs
  18. whose lengths are not a multiple of k octets. For such
  19. algorithms, the method shall be to pad the input at the
  20. trailing end with k - (l mod k) octets all having value k -
  21. (l mod k), where l is the length of the input. In other
  22. words, the input is padded at the trailing end with one of
  23. the following strings:
  24.  
  25. 01 -- if l mod k = k-1
  26. 02 02 -- if l mod k = k-2
  27. .
  28. .
  29. .
  30. k k ... k k -- if l mod k = 0
  31.  
  32. The padding can be removed unambiguously since all input is
  33. padded and no padding string is a suffix of another. This
  34. padding method is well-defined if and only if k < 256;
  35. methods for larger k are an open issue for further study.
  36. '''
  37. def __init__(self, k=16):
  38. self.k = k
  39.  
  40. ## @param text The padded text for which the padding is to be removed.
  41. # @exception ValueError Raised when the input padding is missing or corrupt.
  42. def decode(self, text):
  43. '''
  44. Remove the PKCS#7 padding from a text string
  45. '''
  46. nl = len(text)
  47. val = int(binascii.hexlify(text[-1]), 16)
  48.  
  49. if val > self.k:
  50. raise ValueError('Input is not padded or padding is corrupt')
  51.  
  52. l = nl - val
  53.  
  54. return text[:l]
  55.  
  56. ## @param text The text to encode.
  57. def encode(self, text):
  58. '''
  59. Pad an input string according to PKCS#7
  60. '''
  61. l = len(text)
  62. output = StringIO.StringIO()
  63. val = self.k - (l % self.k)
  64.  
  65. for _ in xrange(val):
  66. output.write('%02x' % val)
  67.  
  68. return text + binascii.unhexlify(output.getvalue())
  69.  
  70.  
  71.  
  72. # 使用256位的AES,Python会根据传入的Key长度自动选择,长度为16时使用128位的AES
  73. key = 'a12e93c9edadeaa47eb1aeabe27dabef'
  74. mode = AES.MODE_CBC
  75. #iv = '1234567812345678' # AES的CBC模式使用IV
  76. iv = 'a12e93c9edadeaa4' # AES的CBC模式使用IV
  77.  
  78. encoder = PKCS7Encoder()
  79. text = "This is for test."
  80.  
  81. def encrypt(data):
  82. encryptor = AES.new(key, AES.MODE_CBC, iv)
  83. padded_text = encoder.encode(data)
  84. encrypted_data = encryptor.encrypt(padded_text)
  85.  
  86. return base64.b64encode(encrypted_data)
  87.  
  88. def decrypt(data):
  89. cipher = base64.b64decode(data)
  90. decryptor = AES.new(key, AES.MODE_CBC, iv)
  91. plain = decryptor.decrypt(cipher)
  92.  
  93. return encoder.decode(plain)
  94.  
  95. #encrypted_text = encrypt(text)
  96. encrypted_text = 'MD1ZOvuyvut4VEed4rf+8YKaOHyECJK/RWLcfVsJwjAEZp8Hhi1zi7oH3PLSygjFCAxCRJqMBzm/qhreznkg34Vgbho+zwprTgl4M0c0lRkvLzWzXmSYG8pcqth1qnbNSwQeS3MPuofgVXR0SGMTIzicCXDlmwQV9uvIJekgES2LMse4pVndcrftI9f6UbIiT085DhAaiV9yGsV3r4FES+LnwP9ZNi58TButNC9owyKh9RuRn7z04LfNy++7iLjzk/HurOkBkJewHSchLER+pK94qhg6Lj8mW7dl+y5j3wbXY9SodNK+S8LDRYCa1JyZ/w8rffUK8YCY+jCT3ZmV8G5vdUENTqsrB4jX87C+XQCY9WEG+VQ5MK5XlhhvMPZyn2NLZUi6gW1HjqE6i/uefzq/LFl47cL2Hmr/cLbfI5rF+d1hMAIZGNnRxjYkVVvipEwRSlkD47ZVFLiWRKPusB7Lke3mnGJ1O+5eQnREL7Q/xpRT+3JuCcOqZIZJFFrJXMj9CXsJGMXxFkfnKT3UAhOi/lRA65Vwt1BEswHuZzLLHquyEYQMc3cOW1vy1Fv4zpYkjHYmxB1g50gwVryrEW2kY58sDdxwDYua3jLwERk='
  97.  
  98. clean_text = decrypt(encrypted_text)
  99.  
  100. print "encrypted_text:", encrypted_text
  101. print "clean_text: ", clean_text

再来个php版本的

 
  1. <?php
  2.  
  3. //function aes256EcbPkcs7PaddingEncrypt($key, $data) {
  4. // $padding = 16 - (strlen($data) % 16);
  5. // $data .= str_repeat(chr($padding), $padding);
  6. // return mcrypt_encrypt(MCRYPT_RIJNDAEL_256, hash('SHA256', $key, true), $data, MCRYPT_MODE_ECB);
  7. //}
  8. //
  9. //function aes256EcbPkcs7PaddingDecrypt($key, $data) {
  10. // $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, hash('SHA256', $key, true), $data, MCRYPT_MODE_ECB);
  11. // $padding = ord($data[strlen($data) - 1]);
  12. // return substr($data, 0, -$padding);
  13. //}
  14.  
  15. $txt="MD1ZOvuyvut4VEed4rf+8YKaOHyECJK/RWLcfVsJwjAEZp8Hhi1zi7oH3PLSygjFCAxCRJqMBzm/qhreznkg34Vgbho+zwprTgl4M0c0lRkvLzWzXmSYG8pcqth1qnbNSwQeS3MPuofgVXR0SGMTIzicCXDlmwQV9uvIJekgES2LMse4pVndcrftI9f6UbIiT085DhAaiV9yGsV3r4FES+LnwP9ZNi58TButNC9owyKh9RuRn7z04LfNy++7iLjzk/HurOkBkJewHSchLER+pK94qhg6Lj8mW7dl+y5j3wbXY9SodNK+S8LDRYCa1JyZ/w8rffUK8YCY+jCT3ZmV8G5vdUENTqsrB4jX87C+XQCY9WEG+VQ5MK5XlhhvMPZyn2NLZUi6gW1HjqE6i/uefzq/LFl47cL2Hmr/cLbfI5rF+d1hMAIZGNnRxjYkVVvipEwRSlkD47ZVFLiWRKPusB7Lke3mnGJ1O+5eQnREL7Q/xpRT+3JuCcOqZIZJFFrJXMj9CXsJGMXxFkfnKT3UAhOi/lRA65Vwt1BEswHuZzLLHquyEYQMc3cOW1vy1Fv4zpYkjHYmxB1g50gwVryrEW2kY58sDdxwDYua3jLwERk=";
  16. $txt=base64_decode($txt);
  17. $key="a12e93c9edadeaa47eb1aeabe27dabef";
  18. $iv ='a12e93c9edadeaa4';
  19.  
  20. $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
  21. mcrypt_generic_init($module, $key, $iv);
  22. $data = mdecrypt_generic($module, $txt);
  23. mcrypt_generic_deinit($module);
  24. mcrypt_module_close($module);
  25.  
  26. $padding = ord($data[strlen($data) - 1]);
  27. $result = substr($data, 0, -$padding);
  28. echo $result;
  29.  
  30. exit();
  31.  
  32. ?>

php果然是...很省事的语言..看他多简短啊.



温馨提示:这篇文章没有解决您的问题?欢迎添加微信:18948083295,有微信小程序专业人员,保证有问必答。转载本站文章请注明转自http://www.okeydown.com/(微信小程序网)。

  • 微信扫描二维码关注官方微信
  • ▲长按图片识别二维码
关注我们

微信小程序官方微信

栏目最新
栏目推荐
返回顶部