16,748
社区成员
发帖
与我相关
我的任务
分享
function Enc(Str:String):String;
var
i,j:Integer;
begin
Result:='';
j:=0;
for i:=1 to Length(Str) do
begin
Result:=Result+IntToHex(Byte(Str[i]) xor XorKey[j],2);
j:=(j+1) mod 8;
end;
end;
function Dec(Str:String):String;
var
i,j:Integer;
begin
Result:='';
j:=0;
for i:=1 to Length(Str) div 2 do
begin
Result:=Result+Char(StrToInt('$'+Copy(Str,i*2-1,2)) xor XorKey[j]);
j:=(j+1) mod 8;
end;
end;
// RemObjects CS to Pascal 0.2
namespace MYEncryption;
interface
uses
System,
System.IO,
System.Text,
System.Security.Cryptography;
type
Encryption = public class
public
class method Encrypt(plainText: String; passPhrase: String; saltValue: String; hashAlgorithm: String; passwordIterations: Integer; initVector: String; keySize: Integer): String;
class method Decrypt(cipherText: String; passPhrase: String; saltValue: String; hashAlgorithm: String; passwordIterations: Integer; initVector: String; keySize: Integer): String;
class method Encrypt(plainText: String; passPhrase: String): String;
// can be any string
// can be "MD5"
// can be any number
// must be 16 bytes
// can be 192 or 128
class method Decrypt(cipherText: String; passPhrase: String): String;
end;
implementation
class method Encryption.Encrypt(plainText: String; passPhrase: String; saltValue: String; hashAlgorithm: String; passwordIterations: Integer; initVector: String; keySize: Integer): String;
begin
var initVectorBytes: array of Byte := Encoding.ASCII.GetBytes(initVector);
var saltValueBytes: array of Byte := Encoding.ASCII.GetBytes(saltValue);
var plainTextBytes: array of Byte := Encoding.UTF8.GetBytes(plainText);
var password: PasswordDeriveBytes := new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations);
var keyBytes: array of Byte := password.GetBytes(keySize / 8);
var symmetricKey: RijndaelManaged := new RijndaelManaged();
symmetricKey.Mode := CipherMode.CBC;
var encryptor: ICryptoTransform := symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);
var memoryStream: MemoryStream := new MemoryStream();
var cryptoStream: CryptoStream := new CryptoStream(memoryStream, encryptor, CryptoStreamMode.&Write);
cryptoStream.&Write(plainTextBytes, 0, plainTextBytes.Length);
cryptoStream.FlushFinalBlock();
var cipherTextBytes: array of Byte := memoryStream.ToArray();
memoryStream.Close();
cryptoStream.Close();
var cipherText: String := Convert.ToBase64String(cipherTextBytes);
exit cipherText
end;
class method Encryption.Decrypt(cipherText: String; passPhrase: String; saltValue: String; hashAlgorithm: String; passwordIterations: Integer; initVector: String; keySize: Integer): String;
begin
var initVectorBytes: array of Byte := Encoding.ASCII.GetBytes(initVector);
var saltValueBytes: array of Byte := Encoding.ASCII.GetBytes(saltValue);
var cipherTextBytes: array of Byte := Convert.FromBase64String(cipherText);
var password: PasswordDeriveBytes := new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations);
var keyBytes: array of Byte := password.GetBytes(keySize / 8);
var symmetricKey: RijndaelManaged := new RijndaelManaged();
symmetricKey.Mode := CipherMode.CBC;
var decryptor: ICryptoTransform := symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);
var memoryStream: MemoryStream := new MemoryStream(cipherTextBytes);
var cryptoStream: CryptoStream := new CryptoStream(memoryStream, decryptor, CryptoStreamMode.&Read);
var plainTextBytes: array of Byte := new Byte[cipherTextBytes.Length];
var decryptedByteCount: Integer := cryptoStream.&Read(plainTextBytes, 0, plainTextBytes.Length);
memoryStream.Close();
cryptoStream.Close();
var plainText: String := Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
exit plainText
end;
class method Encryption.Encrypt(plainText: String; passPhrase: String): String;
begin
var saltValue: String := 's@1tYADDNS';
var hashAlgorithm: String := 'SHA1';
var passwordIterations: Integer := 2;
var initVector: String := '@1Y2A3D4D5N6S7F8';
var keySize: Integer := 256;
exit Encrypt(plainText, passPhrase, saltValue, hashAlgorithm, passwordIterations, initVector, keySize)
end;
class method Encryption.Decrypt(cipherText: String; passPhrase: String): String;
begin
var saltValue: String := 's@1tYADDNS';
var hashAlgorithm: String := 'SHA1';
var passwordIterations: Integer := 2;
var initVector: String := '@1Y2A3D4D5N6S7F8';
var keySize: Integer := 256;
exit Decrypt(cipherText, passPhrase, saltValue, hashAlgorithm, passwordIterations, initVector, keySize)
end;
end.