IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Delphi XE10.x实现Android下AES/CBC/PKCS7Padding -> 正文阅读

[移动开发]Delphi XE10.x实现Android下AES/CBC/PKCS7Padding

这有两个在线的AES加密网站,加密结果是一样的。

https://www.javainuse.com/aesgenerator

https://www.codeusingjava.com/tools/aes

?Delphi XE10.x调用bouncy castle库,也可以得到相同的结果,Base64编码的字符串

BCklCa2IpgHiLT6k4DOELQ==

unit AesUtil;

interface

uses bcprovext,
     System.SysUtils, System.Types, math,
     System.Classes, system.NetEncoding,
     Androidapi.Helpers,
     java.nio.BitConverter,
     Androidapi.JNIBridge,
     Androidapi.JNI.JavaTypes;

function AESEncryptCBC(const encrypted: Boolean; const AInput, AKey, AIV : String):string;

implementation


function AESEncryptCBC(const encrypted: Boolean; const AInput, AKey, AIV : String):string;
var

    blocksize    : integer;
    keyBytes, ivBytes,
    inputBytes,
    LJTemp,
    outputBytes,
    comparisonBytes : TJavaArray<Byte>;
    iv, vTemp     : TArray<Byte>;
    val,len       : integer;
    keyParam      : JKeyParameter;
    keyParamWithIV: JParametersWithIV;
    encryptedInput: JString;
    vBytes        : TBytes;
    engine : JAesEngine ;
    blockCipher: JCbcBlockCipher ;
    cipher: JPaddedBufferedBlockCipher ;
    function ByteToHex(InByte:byte):shortstring;
    const
       Digits:array[0..15] of char='0123456789ABCDEF';
    begin
      result:=digits[InByte shr 4]+digits[InByte and $0F];
    end;

begin

    try
        iv := TEncoding.ASCII.GetBytes(AIV);
        len := Length(iv);
        ivBytes := TJavaArray<Byte>.Create(len);
        //Move(iv, ivBytes, len);
        for val := 0 to len -1 do  ivBytes[val] := iv[val];

        engine := TJAesEngine.Create;
        blockCipher := TJCbcBlockCipher.JavaClass.init(TJBlockCipher.Wrap(engine)); //CBC
        cipher := TJPaddedBufferedBlockCipher.JavaClass.init(TJBlockCipher.Wrap(blockCipher));//, TJBlockCipherPadding.Wrap(TJPKCS7Padding.Create));
        blocksize := cipher.GetBlockSize();

        //TBitConverter.From<Int32>(iv, vTemp);
        //vTemp := TArray<Byte>.Create( byte( i  shr 24 ), byte( i  shr 16 ), byte( i  shr  8 ), byte(i));

        keyBytes      := TJavaArray<Byte>.Create(blocksize);
        vTemp := TEncoding.ASCII.GetBytes(Akey);
        len := Length(vTemp);
        //Move(vTemp, keyBytes, len);
        for val := 0 to len -1 do keyBytes[val] := vTemp[val];



        keyParam := TJKeyParameter.JavaClass.init(keyBytes);// Convert.FromBase64String(keyString));
        keyParamWithIV := TJParametersWithIV.JavaClass.init(TJCipherParameters.Wrap(keyParam), ivBytes, 0, 16);//16*8 = 128 bit

        // Encrypt
        if encrypted then
        begin
            //要加密的字符串,包括双字节
            vTemp := TEncoding.UTF8.GetBytes(Ainput);
            len := Length(vTemp);
            inputBytes := TJavaArray<Byte>.Create(len);
            for val := 0 to len -1 do
              inputBytes[val] := vTemp[val];
            cipher.Init(true, TJCipherParameters.Wrap(keyParamWithIV));
            len := cipher.GetOutputSize(inputBytes.Length);
            outputBytes := TJavaArray<Byte>.create(len);
            len := cipher.ProcessBytes(inputBytes, 0, inputBytes.Length, outputBytes,  0);
            cipher.DoFinal(outputBytes, len); //Do the final block
            SetLength(vBytes, outputBytes.Length);
            for val := 0 to Length(vBytes) -1 do
              vBytes[val] := outputBytes[val];
            encryptedInput := TJBase64.JavaClass.toBase64String(outputBytes);
            //TNetEncoding.Base64.Encode(vBytes);
            Result := JStringToString(encryptedInput);
        end
        else //Decrypt
        begin
           encryptedInput := StringToJString(Ainput);
           outputBytes := TJBase64.JavaClass.decode(encryptedInput);
           cipher.Init(false, TJCipherParameters.Wrap(keyParamWithIV));
           len := cipher.GetOutputSize(outputBytes.Length);
           comparisonBytes := TJavaArray<Byte>.create(len);
           len := cipher.ProcessBytes(outputBytes, 0, outputBytes.Length, comparisonBytes, 0);
           cipher.DoFinal(comparisonBytes, len); //Do the final block
           len := comparisonBytes.Length;
           SetLength(vBytes, len);
            for val := 0 to len -1 do
              vBytes[val] := comparisonBytes[val];

           Result := TEncoding.UTF8.GetString(vBytes);
        end;
    except on E: Exception do
       Result := e.Message;
    end;

end;

end.

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 10:54:40  更:2021-07-23 10:55:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 13:17:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码