我需要解密一个字符串,该字符串是从最初使用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=='
答案 0 :(得分:0)
如果确实存在任何密文打包,那么将包括初始化向量(IV),假设首先使用了初始化向量。
简而言之,如果我使用AES-128加密字符串:
E(plaintext, key, iv)
iv+ciphertext
iv+ciphertext+mac
在解密时,我会在解密之前验证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
方法。