在我的windows Phone8应用程序中,我需要使用desede/cbc/pkcs5padding和PBKDF2密钥加密-解密数据。
我找到了如何使用Bouncy Castle加密的示例:
http://www.go4expert.com/articles/bouncy-castle-net-implementation-triple-t24829/
并且我能够加密我的数据(文本),但是我不能使用此代码解密我加密的数据。当我试图调用DoFinal()时,它抛出异常“pad block corrupted”。
也许我在解密时遗漏了什么?
也许有人知道windows Phone8上使用desede/cbc/pkcs5padding和PBKDF2密钥进行加密的替代库(方法)?
using Raksha.Crypto;
using Raksha.Crypto.Engines;
using Raksha.Crypto.Modes;
using Raksha.Crypto.Paddings;
using Raksha.Crypto.Parameters;
using System;
using System.Security.Cryptography;
using System.Text;
namespace MyNamespace
{
class EncryptDecrypt
{
Rfc2898DeriveBytes key;
BufferedBlockCipher cipherEncrypt;
BufferedBlockCipher cipherDecrypt;
private readonly int ITERACTIONCOUNT = 1000;
private readonly int KEY_LENGTH = 24;
public EncryptDecrypt(string passPhrase, string salt)
{
byte[] SALT = Encoding.UTF8.GetBytes(salt);
key = new Rfc2898DeriveBytes(passPhrase, SALT, ITERACTIONCOUNT);
DesEdeEngine desede = new DesEdeEngine();
cipherEncrypt = new PaddedBufferedBlockCipher(new CbcBlockCipher(desede));
cipherDecrypt = new PaddedBufferedBlockCipher(new CbcBlockCipher(desede));
DesEdeParameters p = new DesEdeParameters(key.GetBytes(KEY_LENGTH));
cipherEncrypt.Init(true, p);
cipherDecrypt.Init(false, p);
}
public byte[] Encrypt(byte[] dataToEncrypt)
{
try
{
byte[] outbytes = cipherEncrypt.DoFinal(dataToEncrypt);
return outbytes;
}
catch(Exception ex)
{
System.Diagnostics.Debug.WriteLine("Encrypt() Exception: " + ex.Message);
return new byte[] { 0 };
}
}
public byte[] Decrypt(byte[] dataToDecrypt)
{
try
{
byte[] result = cipherDecrypt.DoFinal(dataToDecrypt);
return result;
}
catch(CryptoException ex)
{
System.Diagnostics.Debug.WriteLine("Decrypt() Exception: " + ex.Message);
// ex.Message: pad block corrupted
return new byte[] { 0 };
}
}
}
我解决了这个问题!
必须用第一个参数true初始化DesEdeEngine。
DesEdeEngine desede = new DesEdeEngine();
desede.Init(true, key);
我不知道为什么,但我在密码中使用相同的DesEdeEngine对象来解密并不重要。简而言之,默认情况下DesEdeEngine被初始化为decryptor,而不是encrypt,而是填充字节的decrypt块。当DoFinal()中的PaddedBufferedBlockCipher调用PadCount(),其中最后一个字节的值必须>0且<8,我得到的值是48或123之类的,它抛出了一个异常“pad block corrupted”。感谢所有参与的人。
-IV是相同的,因为目前它是静态变量,用于测试目的。 -密码设置为AES/CBC/PKCS5Padding -键设置为AES 编辑 添加IV发生器方法
我被困在一个问题与AES解密在我的Android应用程序。我已经搜索了很多,但无法得到解决方案。 这是步骤,我正在做的。 用我的密钥加密信用卡号并发送到Web服务器 此外,来自服务器的加密信息与我们以加密格式发送的信息不同。在iPhone应用程序中也做了同样的事情,iPhone能够成功地解密信息。 我使用以下代码进行加密和解密。 请建议。 编辑:我还有一件事,那就是工作
问题内容: 在此代码中,此行导致异常: 我从以下位置获得了代码:http : //www.techrepublic.com/blog/software-engineer/attention-android-developers- keep-user-data-safe/ 有任何想法吗? 详细信息:我也在Android上对其进行加密 问题答案: owlstead的建议很有帮助,但是对于这种情况,在使
我正在尝试用C#中的Bouncycastle解密一个河豚加密字符串。 我可以很容易地加密和解密我自己的字符串,但不幸的是,我必须解密由另一个系统生成的字符串。 我可以使用下面的代码用C#/Bouncycastle重新创建相同的字符串,但是我还没有成功地解密它。 ... 下面是我目前解密的内容。错误垫块损坏失败的行是
我目前正在将我的C#AES-GCM密码代码转换为PHP。然而,经过一些研究,我的PHP系统加密的文本不能被C#one解密。我想知道这两种代码是否有区别: C#带弹跳壳: 下面是PHP系统: 有没有人能告诉我,PHP代码中是否有遗漏或不同之处,导致它们的工作方式有所不同?或者PHP函数和BouncyCastle函数之间是否存在某种内部差异,从而使它们有所不同?