Module: Wechat::Cipher

Included in:
Responder
Defined in:
lib/wechat/cipher.rb

Constant Summary collapse

BLOCK_SIZE =
32
CIPHER =
'AES-256-CBC'.freeze

Instance Method Summary collapse

Instance Method Details

#decrypt(msg, encoding_aes_key) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/wechat/cipher.rb', line 18

def decrypt(msg, encoding_aes_key)
  cipher = OpenSSL::Cipher.new(CIPHER)
  cipher.decrypt

  cipher.padding = 0
  key_data = Base64.decode64(encoding_aes_key + '=')
  cipher.key = key_data
  cipher.iv = [key_data].pack('H*')

  plain = cipher.update(msg) + cipher.final
  decode_padding(plain)
end

#encrypt(plain, encoding_aes_key) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
# File 'lib/wechat/cipher.rb', line 6

def encrypt(plain, encoding_aes_key)
  cipher = OpenSSL::Cipher.new(CIPHER)
  cipher.encrypt

  cipher.padding = 0
  key_data = Base64.decode64(encoding_aes_key + '=')
  cipher.key = key_data
  cipher.iv = [key_data].pack('H*')

  cipher.update(plain) + cipher.final
end

#pack(content, app_id) ⇒ Object

app_id or corp_id



32
33
34
35
36
37
38
# File 'lib/wechat/cipher.rb', line 32

def pack(content, app_id)
  random = SecureRandom.hex(8)
  text = content.force_encoding('ASCII-8BIT')
  msg_len = [text.length].pack('N')

  encode_padding("#{random}#{msg_len}#{text}#{app_id}")
end

#unpack(msg) ⇒ Object



40
41
42
43
44
45
46
47
# File 'lib/wechat/cipher.rb', line 40

def unpack(msg)
  msg = decode_padding(msg)
  msg_len = msg[16, 4].reverse.unpack('V')[0]
  content = msg[20, msg_len]
  app_id = msg[(20 + msg_len)..-1]

  [content, app_id]
end