使用使用c#加密的PHP解密字符串

时间:2016-08-05 08:20:41

标签: c# php encryption

我需要解密一个字符串,该字符串是从最初使用c#函数加密的API返回的,基于这些>

http://www.codeproject.com/Tips/704372/How-to-use-Rijndael-ManagedEncryption-with-Csharp

我需要使用PHP解密。

已提供密码和密钥我已尝试使用openssl_decrypt进行多次解密,但我不确定如何在解密中使用密钥?

[更新]我被告知我给出的密码是iv的基础,填充是PKCS7,问题是我不知道如何创建iv。

我有以下示例输入/键,但我不知道如何使用密码,因为我被告知它是iv我需要将其填充到正确的长度,如果是这样的话?

Original string: 'Mondays Suck'
Password/salt: 'this_is_the_password'
Input key: 'this_is_the_input_key'
Encrypted String: 'mAqsxJaA0jpQdefBPug2tw=='

1 个答案:

答案 0 :(得分:0)

如果确实存在任何密文打包,那么将包括初始化向量(IV),假设首先使用了初始化向量。

简而言之,如果我使用AES-128加密字符串:

  1. 我可能会使用PBKDF2来获取弱密码和盐来生成用于进行加密的密钥材料。
  2. 我将生成一个特定于消息的(即一次性使用)初始化向量用于加密
  3. 然后我使用前面步骤中生成的密钥[material]和IV来使用AES-128加密字符串:E(plaintext, key, iv)
  4. 如果字符串超过16个字节,我还必须使用加密模式,如CBC,CTR等。
  5. 为方便起见,我只需连接:iv+ciphertext
  6. 就可以在密文前面“打包”IV(不需要保密)
  7. 如果我认真对待这项工作,我会生成密文的消息验证码,并附加以下内容:iv+ciphertext+mac
  8. 在解密时,我会在解密之前验证MAC(如果我要做的那样),然后我需要将IV与密文分开,然后通过我的解密例程运行它:{{1} }。

    要记住的另一件事是编码,因为有时我们将Base64编码的字符串作为比原始数据更加打印友好的格式传递。在处理解包,解密等工作之前,你当然必须解码它。

    出于学术目的,我在教自己加密时创建了Crypto Implementation (DRAFT),并希望记录流程和最佳实践,并在我必须处理此工作时将所有“活动部分”视为参考东西。要遵循的规则很多,但总的来说,有很多良好的学习和专业发展机会。

    希望有所帮助!

    编辑:根据我在下面的评论,我只是查看了C#实现的原始源代码。看来在PHP中解密这个问题的唯一方法是使用PHP等效的C#D(ciphertext, key, iv),因为这是负责生成IV的部分。研究Rfc2898DeriveBytes例程,你会看到它从哪里获得IV(它基本上意味着使用相同的盐)。如果您真的无法控制或影响加密例程,您可能倾向于破解涉及using C# DLLs in PHP的解决方案,然后从PHP调用DecryptRijndael方法。