我正在尝试将一些C#代码转换为ruby。以下是C#代码的片段:
string Encrypt(string toEncrypt, string key) {
byte[] keyArray;
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
keyArray = UTF8Encoding.UTF8.GetBytes(key);
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tdes.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
我最大的问题似乎是让填充规范正确。
这是我到目前为止所拥有的......
des = OpenSSL::Cipher::Cipher.new('des-ecb')
des.encrypt # OpenSSL::PKCS7 has to passed in somewhere
des.key = '--The Key--'
update_value = des.update(val)
答案 0 :(得分:4)
在运行所有可用的OpenSSL密码并测试以查看是否有任何输出导致相同的加密字符串没有成功之后,我做了同样的事情,但这次传入填充整数(从0开始 - 20),并再次遍历所有密码。
这导致了成功!
最终代码:
def encrypt val
des = OpenSSL::Cipher::Cipher.new 'DES-EDE3'
des.encrypt
des.padding = 1
des.key = '--SecretKey--'
update_value = des.update(val)
up_final = update_value + des.final
Base64.encode64(up_final).gsub(/\n/, "")
end
最值得注意的是我必须删除换行符,并且必须填入1的填充。
我仍然对填充感到困惑......但是,想要更新所有人,以防万一有人在将来遇到这个问题
:更新:填充无关紧要......如果你拿出那条线它仍然加密就像你在那里有任何数字一样...我错过的最大区别就是取出换行符
答案 1 :(得分:2)
请尝试使用'des-ede3-ecb'
或'3des'
作为名称。 'des-ecb'
不太可能返回三重DES密码。
PKCS#7通常是OpenSSL的默认设置,因此您可以不必指定它。
确保您的字符编码(UTF-8,与ASCII兼容,最多为7F
)和编码(base 64)也匹配。