Skip to content

Commit f71c4e1

Browse files
author
Inbal Tako
committed
Fix encryption utils
1 parent 6c70994 commit f71c4e1

2 files changed

Lines changed: 36 additions & 31 deletions

File tree

lib/utils/encryption_utils.rb

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,49 @@
11
# frozen_string_literal: true
22

33
require 'openssl'
4+
require 'digest'
5+
require 'base64'
46
require 'models/client_token'
57

68
class EncryptionUtils
7-
BLOCK_SIZE = 16
8-
KEY_SIZE = 32
9-
10-
def self.encrypt(text, cipher_key)
11-
begin
12-
cipher = OpenSSL::Cipher::AES.new(KEY_SIZE, :CBC).encrypt
13-
cipher.padding = 0
14-
15-
if text.size % BLOCK_SIZE != 0
16-
return nil
9+
def self.padding_key(key, length)
10+
if key.length == length
11+
key
12+
else
13+
if key.length > length
14+
key.slice(0, length)
15+
else
16+
(length - key.length).times { key << '0' }
17+
key
1718
end
19+
end
20+
end
1821

19-
cipher_key = Digest::SHA1.hexdigest cipher_key
20-
cipher.key = cipher_key.slice(0, BLOCK_SIZE)
21-
s = cipher.update(text) + cipher.final
22-
23-
s.unpack('H*')[0].upcase
22+
def self.encrypt(plain_text, secret_key)
23+
begin
24+
cipher = OpenSSL::Cipher.new('aes-256-cbc')
25+
cipher.encrypt
26+
iv = cipher.random_iv
27+
cipher.key = padding_key(secret_key, 32)
28+
encrypted = cipher.update(plain_text) + cipher.final
29+
(iv + encrypted).unpack1('H*')
2430
rescue StandardError
2531
''
2632
end
2733
end
2834

29-
def self.decrypt(encrypted, cipher_key)
35+
def self.decrypt(cipher_text, secret_key)
3036
begin
31-
cipher = OpenSSL::Cipher::AES.new(KEY_SIZE, :CBC).decrypt
32-
cipher.padding = 0
33-
34-
cipher_key = Digest::SHA1.hexdigest cipher_key
35-
cipher.key = cipher_key.slice(0, BLOCK_SIZE)
36-
s = [encrypted].pack('H*').unpack('C*').pack('c*')
37-
38-
rv = cipher.update(s) + cipher.final
39-
rv.strip
37+
cipher = OpenSSL::Cipher.new('aes-256-cbc')
38+
cipher.decrypt
39+
raw_data = [cipher_text].pack('H*')
40+
cipher.iv = raw_data.slice(0, 16)
41+
cipher.key = padding_key(secret_key, 32)
42+
decrypted = JSON.parse(cipher.update(raw_data.slice(16, raw_data.length)) + cipher.final)
43+
44+
return ClientToken.new(decrypted['cid'], decrypted['vid'], decrypted['fp'])
4045
rescue StandardError
41-
ClientToken.new('', '', '')
46+
ClientToken.new('', '','')
4247
end
4348
end
4449
end

spec/spec_encryption_utils.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@
55

66
RSpec.describe EncryptionUtils do
77
it 'encrypts' do
8-
secret_key = 'B00C42DAD33EAC6F6572DA756EA4915349C0A4F6'
8+
secret_key = 'AFD16D89150FD7FB19EE9E936DC1AE3547CE119B'
99
payload = '{"cid":"198a41ff-a10f-4cda-a2f3-a9ca80c0703b","vi":"148a42ff-b40f-4cda-a2f3-a8ca80c0703b","fp":"6d8cabd95987f8318b1fe01593d5c2a5.24700f9f1986800ab4fcc880530dd0ed"}'
1010
result = EncryptionUtils.encrypt(payload, secret_key)
1111

1212
expect(result).not_to be_nil
1313
end
1414

1515
it 'decrypts' do
16-
secret_key = 'B00C42DAD33EAC6F6572DA756EA4915349C0A4F6'
17-
encrypted_payload = '56463564485361554e70763250546e334954565667673d3d246949482f446b72352f6b31316a63466d4c515339703631754b6e54557854546e4a554433634b67744641712f44647356386569636f6a322b4c55354d0a4c6b72504d37464c6f5746632f614f644b542f38585346374566515954355859326a386e576a4439717a7a6a4269744363522f79386851522b7067640a2f67307a6e3264385a5130705a6d44356f4a50396e3236764133635144387379586d6835377475626452783165425976764b6b756952746b79544e350a58477552522f7051706c5a3838646b6a4f44753959626332697a723433564b6b72496943624d584f707770456355316d61662f7256706b3d'
18-
cid = '198a41ff-a10f-4cda-a2f3-a9ca80c0703b'
19-
fp = '6d8cabd95987f8318b1fe01593d5c2a5.24700f9f1986800ab4fcc880530dd0ed'
16+
secret_key = 'AFD16D89150FD7FB19EE9E936DC1AE3547CE119B'
17+
encrypted_payload = 'dfcc35bc71653771d4541f08937c35cbc98faea2c061ff7904f80abf7c072f0029157ed97a55b00efe09fb0d2f86f5693ecbba3f6339862ed3908f0d746533133c8c838be641dad76cf3f9cce67dc1b48cbc8574f24637be4aa90f802ec4b7e5d50b5f9cb3d64e6887ef99b8b941e69370ac7994ccafaf17ceff1d7a68ac30e4b0fe4eb1b844460d5f7687f16902cea61d0ccc085f7ea6087fae38482cd1ee1c7574dc4b0e996bc4e5946eeb8e8509fbdd9f1884eb3f02cbbaefe4566c999d50'
18+
cid = '12946065-65af-4825-9893-fce901c8da49'
19+
fp = '9a6e6a7d636ca772924bd2219853d73c.24700f9f1986800ab4fcc880530dd0ed'
2020

2121
result = EncryptionUtils.decrypt(encrypted_payload, secret_key)
2222

0 commit comments

Comments
 (0)