gpt4 book ai didi

c# - 如何在 C# 中解密在 Delphi 中加密的字符串

转载 作者:太空宇宙 更新时间:2023-11-03 11:47:52 26 4
gpt4 key购买 nike


我们有一个用 Delphi 编写的项目,我们想将其转换为 C#。问题是我们有一些密码和设置被加密并写入注册表。当我们需要一个指定的密码时,我们从注册表中获取它并解密它以便我们可以使用它。对于转换为 C#,我们必须以相同的方式进行,以便拥有旧版本并希望升级它的用户也可以使用该应用程序。
下面是我们在Delphi中加密/解密字符串的代码:

unit uCrypt;

interface

function EncryptString(strPlaintext, strPassword : String) : String;
function DecryptString(strEncryptedText, strPassword : String) : String;

implementation

uses
DCPcrypt2, DCPblockciphers, DCPdes, DCPmd5;
const
CRYPT_KEY = '1q2w3e4r5t6z7u8';

function EncryptString(strPlaintext) : String;
var
cipher : TDCP_3des;
strEncryptedText : String;
begin
if strPlaintext <> '' then
begin
try
cipher := TDCP_3des.Create(nil);
try
cipher.InitStr(CRYPT_KEY, TDCP_md5);
strEncryptedText := cipher.EncryptString(strPlaintext);
finally
cipher.Free;
end;
except
strEncryptedText := '';
end;
end;

Result := strEncryptedText;
end;

function DecryptString(strEncryptedText) : String;
var
cipher : TDCP_3des;
strDecryptedText : String;
begin
if strEncryptedText <> '' then
begin
try
cipher := TDCP_3des.Create(nil);
try
cipher.InitStr(CRYPT_KEY, TDCP_md5);
strDecryptedText := cipher.DecryptString(strEncryptedText);
finally
cipher.Free;
end;
except
strDecryptedText := '';
end;
end;

Result := strDecryptedText;
end;
end.

例如,当我们想要加密字符串 asdf1234 时,我们会得到结果 WcOb/iKo4g8=
我们现在想用 C# 解密该字符串。这是我们尝试做的:

public static void Main(string[] args)
{
string Encrypted = "WcOb/iKo4g8=";
string Password = "1q2w3e4r5t6z7u8";
string DecryptedString = DecryptString(Encrypted, Password);
}

public static string DecryptString(string Message, string Passphrase)
{
byte[] Results;
System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

// Step 1. We hash the passphrase using MD5
// We use the MD5 hash generator as the result is a 128 bit byte array
// which is a valid length for the TripleDES encoder we use below

MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));

// Step 2. Create a new TripleDESCryptoServiceProvider object
TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();

// Step 3. Setup the decoder
TDESAlgorithm.Key = TDESKey;
TDESAlgorithm.Mode = CipherMode.ECB;
TDESAlgorithm.Padding = PaddingMode.None;

// Step 4. Convert the input string to a byte[]
byte[] DataToDecrypt = Convert.FromBase64String(Message);

// Step 5. Attempt to decrypt the string
try
{
ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
}
finally
{
// Clear the TripleDes and Hashprovider services of any sensitive information
TDESAlgorithm.Clear();
HashProvider.Clear();
}

// Step 6. Return the decrypted string in UTF8 format
return UTF8.GetString(Results);
}

嗯,结果与预期的结果不同。在我们调用 DecryptString() 之后,我们希望得到 asdf1234 但我们得到了其他东西。
有没有人知道如何正确解密?
提前致谢
西蒙

编辑:
好的,谢谢大家的建议。我们找不到如何在 C# 中完成这一切,所以我们决定采用我们的后备版本,按照建议使用带有 P/Invoke 的 Delphi DLL。

最佳答案

我会推荐一种不同的方法。您应该第一次 P/Invoke 原始代码来读回密码,然后使用.net 代码重新保存。这样您就可以避免两个平台中不同加密例程的问题。

关于c# - 如何在 C# 中解密在 Delphi 中加密的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2942240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com