module JdPay::Des

Public Class Methods

decrypt_3des(encrypt_str, options = {}) click to toggle source
# File lib/jd_pay/des.rb, line 13
def decrypt_3des(encrypt_str, options = {})
  des2 = OpenSSL::Cipher::Cipher.new('des-ede3')
  des2.decrypt
  des2.key = decode_key(options)
  des2.iv = des2.random_iv
  des2.padding = 0
  result = (des2.update(to_decimal(encrypt_str)) + des2.final).bytes
  result.first(valid_size(result.shift(4))).map(&:chr).join.force_encoding('utf-8').encode('utf-8')
end
encrypt_3des(str, options = {}) click to toggle source
# File lib/jd_pay/des.rb, line 4
def encrypt_3des(str, options = {})
  des = OpenSSL::Cipher::Cipher.new('des-ede3')
  des.encrypt
  des.key = decode_key(options)
  des.iv = des.random_iv
  str = des.update(format_str_data(str))
  to_hex(str.bytes)
end

Private Class Methods

decode_key(options = {}) click to toggle source
# File lib/jd_pay/des.rb, line 25
def decode_key(options = {})
  Base64.decode64(options[:des_key] || JdPay.des_key)
end
format_str_data(str) click to toggle source

格式化加密元数据

# File lib/jd_pay/des.rb, line 46
def format_str_data(str)
  str_bytes = str.bytes
  str_bytes_size = str_bytes.length
  (valid_size_array(str_bytes_size) + str_bytes + padding_array(str_bytes_size)).map(&:chr).join
end
padding_array(num) click to toggle source

计算补位数据数组

# File lib/jd_pay/des.rb, line 30
def padding_array(num)
  temp = (num + 4) % 8
  Array.new(temp == 0 ? 0 : (8 - temp), 0x00)
end
to_decimal(str) click to toggle source

16进制string转10进制

# File lib/jd_pay/des.rb, line 58
def to_decimal(str)
  # str.scan(/../).map{ |r| r.hex.chr }.join
  Array(str).pack('H*')
end
to_hex(arr) click to toggle source

10进制string转16进制

# File lib/jd_pay/des.rb, line 53
def to_hex(arr)
  arr.map { |num| "%02x" % num }.join
end
valid_size(arr) click to toggle source

根据数组算出有效数据值

# File lib/jd_pay/des.rb, line 41
def valid_size(arr)
  to_hex(arr).to_i(16)
end
valid_size_array(num) click to toggle source

有效数据长度数组

# File lib/jd_pay/des.rb, line 36
def valid_size_array(num)
  [num >> 24 & 0xff, num >> 16 & 0xff, num >> 8 & 0xff, num & 0xff]
end