xe8 ok

unit TntLXCryptoUtils;

interface

function AES128_Encrypt( Value, Password : string ) : string;
function AES128_Decrypt( Value, Password : string ) : string; implementation uses
SysUtils,
Windows,
IdCoderMIME,
IdGlobal; // -------------------------------------------------------------------------------------------------------------------------
// Base64 Encode/Decode
// ------------------------------------------------------------------------------------------------------------------------- function Base64_Encode( const Value : TIdBytes ) : string;
var
Encoder : TIdEncoderMIME;
begin
Encoder := TIdEncoderMIME.Create( nil );
try
Result := Encoder.EncodeBytes( Value );
finally
Encoder.Free;
end;
end; function Base64_Decode( Value : string ) : TIdBytes;
var
Encoder : TIdDecoderMIME;
begin
Encoder := TIdDecoderMIME.Create( nil );
try
Result := Encoder.DecodeBytes( Value );
finally
Encoder.Free;
end;
end; // -------------------------------------------------------------------------------------------------------------------------
// WinCrypt.h
// ------------------------------------------------------------------------------------------------------------------------- type
HCRYPTPROV = Cardinal;
HCRYPTKEY = Cardinal;
ALG_ID = Cardinal;
HCRYPTHASH = Cardinal; const
_lib_ADVAPI32 = 'ADVAPI32.dll';
CALG_SHA_ = ;
CALG_AES_ = ;
CRYPT_NEWKEYSET = $;
PROV_RSA_AES = ;
KP_MODE = ;
CRYPT_MODE_CBC = ; function CryptAcquireContext(
var Prov : HCRYPTPROV;
Container : PChar;
Provider : PChar;
ProvType : LongWord;
Flags : LongWord ) : LongBool; stdcall;
external _lib_ADVAPI32 name 'CryptAcquireContextW';
function CryptDeriveKey(
Prov : HCRYPTPROV;
Algid : ALG_ID;
BaseData : HCRYPTHASH;
Flags : LongWord;
var Key : HCRYPTKEY ) : LongBool; stdcall;
external _lib_ADVAPI32 name 'CryptDeriveKey';
function CryptSetKeyParam(
hKey : HCRYPTKEY;
dwParam : LongInt;
pbData : PBYTE;
dwFlags : LongInt ) : LongBool stdcall; stdcall;
external _lib_ADVAPI32 name 'CryptSetKeyParam';
function CryptEncrypt(
Key : HCRYPTKEY;
Hash : HCRYPTHASH;
Final : LongBool;
Flags : LongWord;
pbData : PBYTE;
var Len : LongInt;
BufLen : LongInt ) : LongBool; stdcall;
external _lib_ADVAPI32 name 'CryptEncrypt';
function CryptDecrypt(
Key : HCRYPTKEY;
Hash : HCRYPTHASH;
Final : LongBool;
Flags : LongWord;
pbData : PBYTE;
var Len : LongInt ) : LongBool; stdcall;
external _lib_ADVAPI32 name 'CryptDecrypt';
function CryptCreateHash(
Prov : HCRYPTPROV;
Algid : ALG_ID;
Key : HCRYPTKEY;
Flags : LongWord;
var Hash : HCRYPTHASH ) : LongBool; stdcall;
external _lib_ADVAPI32 name 'CryptCreateHash';
function CryptHashData(
Hash : HCRYPTHASH;
Data : PChar;
DataLen : LongWord;
Flags : LongWord ) : LongBool; stdcall;
external _lib_ADVAPI32 name 'CryptHashData';
function CryptReleaseContext(
hProv : HCRYPTPROV;
dwFlags : LongWord ) : LongBool; stdcall;
external _lib_ADVAPI32 name 'CryptReleaseContext';
function CryptDestroyHash( hHash : HCRYPTHASH ) : LongBool; stdcall;
external _lib_ADVAPI32 name 'CryptDestroyHash';
function CryptDestroyKey( hKey : HCRYPTKEY ) : LongBool; stdcall;
external _lib_ADVAPI32 name 'CryptDestroyKey'; // ------------------------------------------------------------------------------------------------------------------------- {$WARN SYMBOL_PLATFORM OFF} function __CryptAcquireContext( ProviderType : Integer ) : HCRYPTPROV;
begin
if ( not CryptAcquireContext( Result, nil, nil, ProviderType, ) )
then
begin
if HRESULT( GetLastError ) = NTE_BAD_KEYSET
then
Win32Check( CryptAcquireContext( Result, nil, nil, ProviderType,
CRYPT_NEWKEYSET ) )
else
RaiseLastOSError;
end;
end; function __AES128_DeriveKeyFromPassword(
m_hProv : HCRYPTPROV;
Password : string ) : HCRYPTKEY;
var
hHash : HCRYPTHASH;
Mode : DWORD;
begin
Win32Check( CryptCreateHash( m_hProv, CALG_SHA_, , , hHash ) );
try
Win32Check( CryptHashData( hHash, PChar( Password ),
Length( Password ) * SizeOf( Char ), ) );
Win32Check( CryptDeriveKey( m_hProv, CALG_AES_, hHash, , Result ) );
// Wine uses a different default mode of CRYPT_MODE_EBC
Mode := CRYPT_MODE_CBC;
Win32Check( CryptSetKeyParam( Result, KP_MODE, Pointer( @Mode ), ) );
finally
CryptDestroyHash( hHash );
end;
end; procedure mybytes(
const astr : string;
var Buffer : TIdBytes );
var
abytes : TBytes;
begin
abytes := TEncoding.Unicode.GetBytes( astr );
Buffer := RawToBytes( abytes, Length( abytes ) );
end; function AES128_Encrypt( Value, Password : string ) : string;
var
hCProv : HCRYPTPROV;
hKey : HCRYPTKEY;
lul_datalen : Integer;
lul_buflen : Integer;
Buffer : TIdBytes;
begin
Assert( Password <> '' );
if ( Value = '' )
then
Result := ''
else
begin
hCProv := __CryptAcquireContext( PROV_RSA_AES );
try
hKey := __AES128_DeriveKeyFromPassword( hCProv, Password );
try
// allocate buffer space
lul_datalen := Length( Value ) * SizeOf( Char );
mybytes( Value + ' ', Buffer );
// Buffer := TEncoding.Unicode.GetBytes(Value + ' ');
lul_buflen := Length( Buffer );
// encrypt to buffer
Win32Check( CryptEncrypt( hKey, , True, , @Buffer[ ], lul_datalen,
lul_buflen ) );
SetLength( Buffer, lul_datalen );
// base 64 result
Result := Base64_Encode( Buffer );
finally
CryptDestroyKey( hKey );
end;
finally
CryptReleaseContext( hCProv, );
end;
end;
end; function AES128_Decrypt( Value, Password : string ) : string;
var
hCProv : HCRYPTPROV;
hKey : HCRYPTKEY;
lul_datalen : Integer;
Buffer : TIdBytes;
abuffer : TBytes;
begin
Assert( Password <> '' );
if Value = ''
then
Result := ''
else
begin
hCProv := __CryptAcquireContext( PROV_RSA_AES );
try
hKey := __AES128_DeriveKeyFromPassword( hCProv, Password );
try
// decode base64
Buffer := Base64_Decode( Value );
// allocate buffer space
lul_datalen := Length( Buffer );
// decrypt buffer to to string
Win32Check( CryptDecrypt( hKey, , True, , @Buffer[ ],
lul_datalen ) );
BytesToRaw( Buffer, abuffer, lul_datalen );
Result := TEncoding.Unicode.GetString( abuffer, , lul_datalen );
finally
CryptDestroyKey( hKey );
end;
finally
CryptReleaseContext( hCProv, );
end;
end;
end; end.

delphi AES encrypt的更多相关文章

  1. Delphi AES加密(转)

    (**************************************************************) (* Advanced Encryption Standard (AE ...

  2. java aes encrypt

    本次使用aes 对称加密算法. 选用aes的原因是,可以还原加密串. 程序如下: public static String encode(String content){ KeyGenerator k ...

  3. Delphi 一些pas

    Delphi -- 创建 桌面.发送到....快速启动栏.开始菜单.程序菜单.右键菜 单 {====================================================== ...

  4. 关于CryptoJS中md5加密以及aes加密的随笔

    最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...

  5. c#和js互通的AES加密解密

    一.使用场景 在使用前后端分离的框架中常常会进行传输数据相互加密解密以确保数据的安全性,如web Api返回加密数据客户端或web端进行解密,或者客户端或web端进行加密提交数据服务端解密数据等等. ...

  6. AES加密解密通用版Object-C / C# / JAVA

    1.无向量 128位 /// <summary> /// AES加密(无向量) /// </summary> /// <param name="plainByt ...

  7. nodejs与javascript中的aes加密

    简介 1.aes加密简单来说,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.高级加密标准已然成为对称密钥加 ...

  8. 非对称技术栈实现AES加密解密

    非对称技术栈实现AES加密解密 正如前面的一篇文章所述,https协议的SSL层是实现在传输层之上,应用层之下,也就是说在应用层上看到的请求还是明码的,对于某些场景下要求这些http请求参数是非可读的 ...

  9. 两种JavaScript的AES加密方式(可与Java相互加解密)

    由于JavaScript属于弱类型脚本语言,因此当其与强类型的后台语言进行数据交互时会产生各种问题,特别是加解密的操作.本人由于工作中遇到用js与Java进行相互加解密的问题,在网上查了很多资料及代码 ...

随机推荐

  1. [HDOJ2512]一卡通大冒险(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2512 给一个数n,问1~n这n个数内的划分.设dp(i,j)为i划分为j个集合时有多少个. 初始化条件 ...

  2. Charles是mac的iddler抓包工具

    windows下面我们经常使用 Fiddler 抓包工具进行代理等一系列操作.然而,在 Mac 下 http://en.softonic.com/s/java-se-6:mac

  3. HDFS的java操作方式

    1.RPC 1.1 RPC (remote procedure call)远程过程调用. 远程过程指的是不是同一个进程. 1.2 RPC至少有两个过程.调用方(client),被调用方(server) ...

  4. Python3 学习第八弹: 模块学习一之模块变量

    __name__变量 用于判断该python文件是否作为主程序运行.若该文件为导入,__name__值为其文件名,若为主程序,则其值为__main__ 这也就是为什么经常看到有一些python文件中有 ...

  5. 单点登录系统构建之二——SSO原理及CAS架构

    基本概念 SSO(Single Sign On)单点登录,是在多个应用系统中,用户只需要登录一次就能访问所有相互信任的应用系统.它包括将这次的主要登录映射到其他应用中用户同一个用户的登录机制. SSO ...

  6. Home Server

    今天分享一个作品--HomeServer,一个基于云存储理念的集家庭数据存储.共享.管理及远程访问为一体的家用存储设备.通俗的讲,就是一个家庭数据银行,为家庭的数据提供专业.安全.便捷.持久.全天候的 ...

  7. css各浏览器的兼容性写法

    各浏览器下的兼容性写法 老版Chrome     -webkit-xxx FF                  -moz-xxx IE9                 -ms-xxx opera ...

  8. Jqgrid入门-Jqgrid分组的实现(八)

    上一章主要说明了如果实现Jqgrid列数据拖动,这一章主要讨论在Jqgrid中如何实现分组功能.         类似于Sql语句的Group By,Jqgrid提供了属性实现数据分组,这样表现数据会 ...

  9. C语言之宏

    所谓的宏就是一种预处理命令,什么是与处理呢?即在编译过程之前先对程序代码做出的必要的转换处理.宏有两个作用: 1.当遇到需要将程序某个特定的数量在程序中出现的所有实例通通加以修改时,程序只需改动一处即 ...

  10. ios ble 参考

    About Core Bluetooth https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Con ...