【问题标题】:ICryptoTransform _NewDecryptor doesn't exist, but _NewEncryptor existsICryptoTransform _NewDecryptor 不存在,但 _NewEncryptor 存在
【发布时间】:2018-07-31 10:01:34
【问题描述】:

我正在尝试像这里一样反思 TripleDES(同样的问题):https://social.msdn.microsoft.com/Forums/vstudio/en-US/8fdfcce7-3a8a-4271-8557-3df715c80df8/weak-key-cryptographic-exception?forum=netfxbcl

TripleDES tripleDESalg = TripleDES.Create();
byte[] EmptyKey = new byte[0x18];
byte[] EmptyIV = new byte[8];
TripleDESCryptoServiceProvider sm = tripleDESalg as TripleDESCryptoServiceProvider;
MethodInfo mi =  sm.GetType().GetMethod("_NewEncryptor",BindingFlags.NonPublic | BindingFlags.Instance);
object[] Par = { EmptyKey, sm.Mode, IV, sm.FeedbackSize, 0 };
ICryptoTransform trans = mi.Invoke(sm, Par) as ICryptoTransform;

加密时我可以成功绕过弱密钥异常,但是当我想要一个解密器时,没有_NewDecryptor这样的东西,只有_NewEncryptor(我使用.GetMethods()检查了这个)。那么有没有可能的方法来为解密器实现相同的目标?也许使用TripleDESCng() 会有所帮助(因为它有不同的方法)。

【问题讨论】:

  • 请注意,当您使用私有反射时,您的应用程序可能会因任何补丁安装或 vNext 安装而中断。绝对不能保证稳定。

标签: c# .net cryptography


【解决方案1】:

查看reference source 没有_NewDecryptor 而是_NewEncryptor 的最后一个参数确定操作模式:

private ICryptoTransform _NewEncryptor (
    byte[] rgbKey, CipherMode mode, byte[] rgbIV, 
    int feedbackSize, CryptoAPITransformMode encryptMode)

encryptMode传递0表示加密,1表示解密所以你需要:

object[] Par = { EmptyKey, sm.Mode, IV, sm.FeedbackSize, 1 };

创建解密器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-06
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多