遇见问题:

delphi的解密需要在c#里面实现

方法一:delphi编写delphi dll组件,c#里面调用

方法二:c#重写delphi的代码进行解析


方法一:

delphi部分代码:

library Project2;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. } uses
SysUtils,
Classes; function UncrypStr(Src, Key: String): string;//字符串解密函数
//对字符串解密(Src:源 Key:密匙)
var KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :string;
SrcPos :Integer;
SrcAsc :Integer;
TmpSrcAsc :Integer;
begin
KeyLen:=Length(Key);
if KeyLen = 0 then key:='delphi';
KeyPos:=0;
offset:=StrToInt('$'+ copy(src,1,2));
SrcPos:=3;
repeat
SrcAsc:=StrToInt('$'+ copy(src,SrcPos,2));
if KeyPos < KeyLen
Then KeyPos := KeyPos + 1
else KeyPos := 1;
TmpSrcAsc := SrcAsc xor Ord(Key[KeyPos]);
if TmpSrcAsc <= offset
then TmpSrcAsc := 255 + TmpSrcAsc - offset
else TmpSrcAsc := TmpSrcAsc - offset;
dest:=dest + chr(TmpSrcAsc);
offset:=srcAsc;
SrcPos:=SrcPos + 2;
until SrcPos >= Length(Src);
Result:=Dest;
end; function filesinfo(files:string): string;stdcall;
//var
//t:TStringlist;
//strs:string;
//strsss:string;
begin
//strs:=StrPas(files);
//t := TStringlist.Create;
//t.LoadFromFile(strs);
//strsss := StringReplace(UncrypStr(t.Strings[0], 'Cernet@4206'), ' ', '', [rfReplaceAll]);
Result:=files;
end;
function Check23(AA:string):Pchar;stdcall;
var
t:TStringlist;
strs:string;
begin
t := TStringlist.Create;
t.LoadFromFile(pchar(AA));
strs := StringReplace(UncrypStr(t.Strings[0], 'Cernet@4206'), ' ', '', [rfReplaceAll]);
result:=pchar(strs);
end ; exports
Check23;
begin
end.

c# 调用 (如果数据量小还可以读出) 这里 的dll组建是x86的 需要把debug改成x86运行

 [DllImport(@"D:\rwas\dlls\Project2.dll", EntryPoint = "Check23")]

        static extern IntPtr Check23(string sx);

    string ss = Marshal.PtrToStringAnsi(Check23("C:\\Users\\忧郁的小学生\\Desktop\\997.azjx"));
if (string.IsNullOrEmpty(ss)) {
Console.WriteLine("xss");
}

方法二:c# 重写 (刚开始用string是不可变长度,每次追加相当于开辟新的空间了,cpu占用过大,最后使用stringbuffer里面可变的)

 public string UncrypStr(string src="",string key="") {
int KeyLen = key.Length;
src = src.Replace("\n", "");
src = src.Replace("\r", "");
if (KeyLen==0) {
key = "delphi";
}
int KeyPos= 0;
int SrcAsc = 0;
StringBuilder ps = new StringBuilder();
string dest = "";
int ks = 0;
//16进制转换位10进制 delph 从起始位开始 c# 字节数组 从0开始
string xs = src.Substring(0, 2);
int offset = Convert.ToInt32(xs, 16);
int SrcPos= 2;
int TmpSrcAsc = 0;
char[] chars = key.ToCharArray();
while (SrcPos < (int)src.Length) {
//截取字符串
string tx = src.Substring(SrcPos, 2);
//转换为16进制 将10进制转换为16进制
SrcAsc = Convert.ToInt32(tx, 16);
//判断解密密钥的起始
if (KeyPos < KeyLen)
{
KeyPos++;
}
else {
KeyPos = 1;
}
//分割成单个字符 char s = chars[KeyPos-1];
//byte[] array = System.Text.Encoding.ASCII.GetBytes(chars); TmpSrcAsc = SrcAsc ^ (int)s;
if (TmpSrcAsc <= offset)
{
TmpSrcAsc = 255 + TmpSrcAsc - offset;
}
else
{
TmpSrcAsc= TmpSrcAsc - offset;
}
//这里十进制直接转换ascii表不行,待转换为16进制
//char chs = (char)TmpSrcAsc;
string chs = TmpSrcAsc.ToString("X"); ps.Append(chs); offset = SrcAsc;
SrcPos= SrcPos + 2;
} return ps.ToString(); }
/// <summary>
/// ascii码转换为中文
/// </summary>
/// <param name="textAscii"></param>
/// <returns></returns>
public string getstring(string textAscii="")
{ string textStr = string.Empty; int k = 0;//字节移动偏移量 byte[] buffer = new byte[textAscii.Length / 2];//存储变量的字节 for (int i = 0; i < textAscii.Length / 2; i++) { //每两位合并成为一个字节 buffer[i] = byte.Parse(textAscii.Substring(k, 2),System.Globalization.NumberStyles.HexNumber); k = k + 2; } //将字节转化成汉字 textStr = Encoding.Default.GetString(buffer); return textStr; }

delphi key解密转c# 解决string 不可变长度问题的更多相关文章

  1. Delphi加密解密算法

    // 加密方法一(通过密钥加密解密)function EncryptString(Source, Key: string): string;function UnEncryptString(Sourc ...

  2. Linux安装rpm包时报错Header V3 DSA/SHA1 Signature, key ID 1d1e034b: NOKEY解决办法

    这是因为yum安装了旧版本的GPG key造成的,解决办法: rpm --import /etc/pki/rpm-gpg/RPM* Header V3 DSA/SHA1 Signature, key ...

  3. GitHub提示 Error: Key already in use解决办法

    GitHub提示 Error: Key already in use解决办法GitHub提示 Error: Key already in use解决办法2014年09月05日 ⁄ 综合 ⁄ 共 290 ...

  4. 微信 AES 解密报错 Illegal key size 三种解决办法

    微信 AES 解密报错 Illegal key size Java 环境 java version "1.8.0_151" Java(TM) SE Runtime Environm ...

  5. C# .net 填充无效,无法被移除 微信小程序解密失败的解决办法

    微信小程序获取用户信息诸如unionId的时候需要解密,如果遇到偶然的解密失败(填充无效,无法被移除),原因很有可能是session_key错误, 也是就你用作解密的session_key并不是微信用 ...

  6. Delphi中的各种字符串、String、PChar、Char数组

    参考博客:http://www.cnblogs.com/pchmonster/archive/2011/12/14/2287686.html 其中的所有代码均在Delphi7下测试通过. Delphi ...

  7. Error 'Cannot add or update a child row: a foreign key constraint fails故障解决

    一大早的,某从库突然报出故障:SQL线程中断! 查看从库状态: mysql> show slave status\G Slave_IO_State: Waiting for master to ...

  8. vetur插件提示 'v-for' directives require 'v-bind:key' directives.错误的解决办法

    在用vscode编写vue代码时,因为安装的有vetur插件,所以当代码中有v-for语法时,会提示 [vue-language-server] 'v-for' directives require ...

  9. Elements in iteration expect to have 'v-bind:key' directives错误的解决办法

    一.错误如下 [eslint-plugin-vue][vue/require-v-for-key]Elements in iteration expect to have 'v-bind:key' d ...

随机推荐

  1. C#怎么从List集合中随机取出其中一个值

    1.首先在该命名空间下创建一个实体,和在Main方法下List集合,为后续做准备: /// <summary> /// 实体 /// </summary> public cla ...

  2. Oracle数据库中的大对象(LOB)数据类型介绍

    一.LOB数据类型的介绍 大对象(LOB)数据类型允许我们保存和操作非结构化和半结构化数据,如文档.图形图像.视频片段.声音文件和XML文件等.DMBS_LOB 包被设计用于操作 LOB 数据类型.从 ...

  3. 多测师讲解自动化--rf断言(下)--_高级讲师肖sir

    1.Page Should Contain 1.1存在页面上的内容 1.2 不存在页面上的内容, 运行抛异常 1.3 Page Should Not Contain 1.4 1.5 输入页面元素,判断 ...

  4. 多测师讲解自动化测试 _RF封装_(三层模式)高级讲师肖sir

    rf自动化:分层作用: 1.项目----有重复的流程(借款-登录,出借-登录) 2.借款--登录(8个流程)机器人:案例层(用例)写在机器人中,1个机器人=1条用例 分三个层次: 1.案例层(存放用例 ...

  5. MeteoInfoLab脚本示例:AIRS Swath HDF数据

    例子中的AIRS Swath HDF数据在Polar Stereographic(南极)投影中接近矩形,需要先从数据中读出经纬度及相关数据数组,利用surfacem函数绘制Swath数据(散点),在s ...

  6. Mysql架构与内部模块-第一章

    Mysql作为大多数中小型企业的首选数据库,也可能是众多同僚接触的第一个数据库,其热门程度不言而喻,一些相对基础的知识本系列不做赘述,主要简述Mysql相关的进阶知识. 本章将由浅入深的讲解从连接My ...

  7. spring boot: 通过filter过滤器实现中文的简体繁体字符集转换(spring boot 2.3.1)

    一,为什么要使用filter来实现简繁体转换? 项目中有时会有同时支持简体和繁体两种字符集的要求, 或者搜索引擎有支持繁体输入字符的需求. 针对繁体字符的显示, 我们通常会在数据库和模板.文案配置中默 ...

  8. selenium-滚动

    移动到指定的坐标(相对当前的坐标移动) driver.execute_script("window.scrollBy(0, 700)"); 移动到窗口绝对位置坐标,如下移动到纵坐标 ...

  9. linux 环境搭建Jenkins

    这里提供一个本地搭建Jenkins的方法,基于wins 的 https://blog.csdn.net/u011541946/article/month/2017/09/2   下面讲的是在服务器上操 ...

  10. Linux命令行bash的快捷键

    提升效率 锁屏 Ctrl + s 敲什么命令没反应,但是敲上去了,屏幕上不做任何反应 Ctrl + q 再解锁 例如: 先Ctrl + s 锁屏 然后在命令行敲入 [root@C8-1 ~]# rm ...