在ruby中,如何使用ECB模式和PKCS7填充进行DES加密

在ruby中,如何使用ECB模式和PKCS7填充进行DES加密,ruby,encryption,cryptography,openssl,Ruby,Encryption,Cryptography,Openssl,我正在尝试将一些C代码转换成ruby。下面是一段C代码: string Encrypt(string toEncrypt, string key) { byte[] keyArray; byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt); keyArray = UTF8Encoding.UTF8.GetBytes(key); TripleDESCryptoS

我正在尝试将一些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)
请尝试使用“des-ede3-ecb”或“3des”作为名称des ecb’不太可能返回三重des密码

PKCS7通常是OpenSSL的默认值,因此您可能不必指定它

请确保您的字符编码UTF-8与ASCII兼容,其值最大为7F,编码基数为64。

请尝试使用“des-ede3-ecb”或仅使用“3des”作为名称des ecb’不太可能返回三重des密码

PKCS7通常是OpenSSL的默认值,因此您可能不必指定它


确保您的字符编码UTF-8与ASCII兼容,其值高达7F,编码基64也匹配。

在运行所有可用的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的填充

我仍然对填充物感到困惑…但是,我想告诉大家我发现了什么,以防将来有人遇到这种情况


:更新:填充毕竟不重要…如果你去掉那行,它仍然加密,就像里面有任何数字一样…我缺少的最大区别是在运行所有可用的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的填充

我仍然对填充物感到困惑…但是,我想告诉大家我发现了什么,以防将来有人遇到这种情况



更新:填充物毕竟没关系…如果你取出那条线,它仍然加密,就像你在里面有任何数字一样……我最大的不同就是取出新线< /P> C代码使用3DES,其他代码使用DES。你应该考虑用安全的东西替换C代码。ECB模式相当弱,UTF-8密钥编码也是一个坏主意,没有理由在AES上使用3DES。好吧,这就是我的评论:ECB没有设置IV我不认为,但是的,它设置了。我有一个更新虽然…我会发布它作为一个答案@NeilSlater ECB不使用IV。块的计算彼此完全独立,因此没有向量,因此也没有初始化向量。这也是为什么它不是加密安全的原因;加密的块可以互相匹配以找到重复。C代码使用3DES,其他代码使用DES。您应该考虑用安全的方法替换C代码。ECB模式相当弱,UTF-8密钥编码也是一个坏主意,没有理由在AES上使用3DES。好吧,这就是我的评论:ECB没有设置IV我不认为,但是的,它设置了。我有一个更新虽然…我会发布它作为一个答案@NeilSlater ECB不使用IV。块的计算彼此完全独立,因此没有向量,因此也没有初始化向量。这也是为什么它不是加密安全的原因;加密块可以相互匹配以找到重复。文档似乎表明PKCS5是默认值…des-ede3-ecb以及3des返回不受支持的密码错误。“des3”是受支持的密码…但是,唉,我对如何获得PKCS7填充感到困惑如果你提供的是不能被字节大小除以8的明文,它会加密吗?抱歉,无法在这里运行带有Openssl支持的ruby,需要重新编译或其他东西。是的,它会加密,但我正在测试C代码的加密输出,它只是不匹配文档似乎表明PKCS5是默认的…des-ede3-ecb以及3des返回了一个不受支持的密码错误。“des3”是一个受支持的密码…但是,唉,我对如何获得PKCS7填充感到困惑如果你提供的是不能被字节大小除以8的明文,它会加密吗?抱歉,无法在这里运行带有Openssl支持的ruby,需要重新编译或其他东西。是的,它会加密,但我正在测试C代码的加密输出,而且它只是不匹配感谢你的反馈,你可以在一段时间后接受你自己的答案
.谢谢你的回复,过一会儿你就可以接受你自己的答案了。