delphi key解密转c# 解决string 不可变长度问题
遇见问题:
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 不可变长度问题的更多相关文章
- Delphi加密解密算法
// 加密方法一(通过密钥加密解密)function EncryptString(Source, Key: string): string;function UnEncryptString(Sourc ...
- 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 ...
- GitHub提示 Error: Key already in use解决办法
GitHub提示 Error: Key already in use解决办法GitHub提示 Error: Key already in use解决办法2014年09月05日 ⁄ 综合 ⁄ 共 290 ...
- 微信 AES 解密报错 Illegal key size 三种解决办法
微信 AES 解密报错 Illegal key size Java 环境 java version "1.8.0_151" Java(TM) SE Runtime Environm ...
- C# .net 填充无效,无法被移除 微信小程序解密失败的解决办法
微信小程序获取用户信息诸如unionId的时候需要解密,如果遇到偶然的解密失败(填充无效,无法被移除),原因很有可能是session_key错误, 也是就你用作解密的session_key并不是微信用 ...
- Delphi中的各种字符串、String、PChar、Char数组
参考博客:http://www.cnblogs.com/pchmonster/archive/2011/12/14/2287686.html 其中的所有代码均在Delphi7下测试通过. Delphi ...
- 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 ...
- vetur插件提示 'v-for' directives require 'v-bind:key' directives.错误的解决办法
在用vscode编写vue代码时,因为安装的有vetur插件,所以当代码中有v-for语法时,会提示 [vue-language-server] 'v-for' directives require ...
- 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 ...
随机推荐
- C++派生类与基类的关系
派生类与基类有这些关系: 1.公有派生类从基类继承所有成员和成员函数 2.公有派生类无法直接访问从基类继承的私有成员,但可以通过继承的公共接口访问. 3.公有派生类无法继承基类的友元函数. 4.基类先 ...
- Apache HttpClient 4.5 在Springboot中使用
ConnectionRequestTimeout httpclient使用连接池来管理连接,这个时间就是从连接池获取连接的超时时间,可以想象下数据库连接池 ConnectTimeout 连接建立时间, ...
- MySQL数据备份脚本
#!/bin/bash ############################# # time:20191210 # fage trainning ######################### ...
- minikube dashboard报503的错误
minikube start之后,minikube dashboard启动web界面报503错误 解决方案,删除掉c盘用户目录下的.kube和.minikube目录,重新启动,具体什么原因导致的呢,也 ...
- 重装Windows系统 入门详解 - 基础教程
重装Windows系统 入门详解 - 基础教程 JERRY_Z. ~ 2020 / 10 / 13 转载请注明出处!️ 目录 重装Windows系统 入门详解 - 基础教程 一.说明 二.具体步骤 ( ...
- C++ 构造函数、拷贝构造函数、赋值运算符
<C++ Primer Plus> 12.1 动态内存和类 12.1.1 复习示例和静态类成员 不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存 如果在头文 ...
- Spark如何进行动态资源分配
一.操作场景 对于Spark应用来说,资源是影响Spark应用执行效率的一个重要因素.当一个长期运行的服务,若分配给它多个Executor,可是却没有任何任务分配给它,而此时有其他的应用却资源紧张,这 ...
- Python列表的增删改查
列表的增: li = ['libai','sushi','dufu','sushi',"白居易"] 第一种: append():向列表末尾追加元素 li.append('diaoc ...
- C# 面试前的准备_基础知识点的回顾_03
1.HTTP中Post和Get区别 这忒简单了吧,大家是不是感觉到兴奋了,长舒一口气了,终于出现了一个可以聊上10分钟的问题了. 根据HTTP规范,Get用于信息获取,而且应该是安全的和幂等的. 参数 ...
- 网络爬虫养成记(第一天)——安装Scrapy
古人云:工欲善其事,必先利其器.在网络爬虫中,Scrapy无疑是一把利器,那么,今天我们来谈谈Scrapy的安装. 幸运的是,Scrapy已经支持Python3.4+了,也就是说,我们可以在pytho ...