所以,我有一個應用程序在使用ColdFusion加密字符串。 ColdFusion的儲存卡的加密助手讓它非常簡單:加密很難:AES加密到十六進制
encrypt('string_to_encrypt','key','AES','HEX')
我試圖做的是用Ruby創建,因爲這ColdFusion的腳本創建相同的加密字符串。不幸的是,加密是人類已知的最令人困惑的計算機科學主題。
我發現了一些使用openssl庫的輔助方法,並給你一個非常簡單的加密/解密方法。這是由此產生的字符串:
"\370\354D\020\357A\227\377\261G\333\314\204\361\277\250"
這看起來unicode-ish對我來說。我已經嘗試了幾個庫將其轉換爲十六進制,但他們都說它包含無效字符。試圖解開它會導致這樣的:
string = "\370\354D\020\357A\227\377\261G\333\314\204\361\277\250"
string.unpack('U')
ArgumentError: malformed UTF-8 character
from (irb):19:in `unpack'
from (irb):19
在一天結束的時候,它應該看起來像這樣(ColdFusion的加密方法的輸出):
F8E91A689565ED24541D2A0109F201EF
當然這是假設所有填充,初始化向量,鹽類,密碼類型以及其他一百萬種其他可能的差異都會排列起來。
下面是我使用加密的簡單腳本/解密:
def aes(m,k,t)
(aes = OpenSSL::Cipher::Cipher.new('aes-256-cbc').send(m)).key = Digest::SHA256.digest(k)
aes.update(t) << aes.final
end
def encrypt(key, text)
aes(:encrypt, key, text)
end
def decrypt(key, text)
aes(:decrypt, key, text)
end
任何幫助嗎?也許只是一個簡單的選項,我可以傳遞給OpenSSL :: Cipher :: Cipher,它會告訴它對最終字符串進行十六進制編碼?
您的字符串不是Unicode。這只是一堆字節。你只需要以十六進制數字形式轉換每個字節。第一個八進制的「370」是十六進制的「F8」。 – Joey 2010-04-02 19:59:16
我不能幫你加密部分,但要顯示一個字節序列(在Ruby中通常以普通字符串的形式表示)作爲一串十六進制數字,可以使用's.each_byte.map {| b | b.to_s(16)}。join'。無論如何,我不認爲Unicode是相關的。 – 2010-04-02 20:00:21