鱼C论坛

 找回密码
 立即注册
查看: 2700|回复: 6

[已解决]求助:delphi程序的加密算法转成JavaScript应该怎么写?

[复制链接]
发表于 2020-1-13 17:29:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 xenli 于 2020-1-14 08:36 编辑

事由:原来的老系统是用delphi写的,最近想把老系统转换成B/S模式的,设计到了一个加密算法不知道怎么改,请教知道的大佬怎么解决。
功能:传入一组字符串,经过加密之后生成加密后的数据。
delphi的代码

  1. procedure TForm1.Button2Click(Sender: TObject);
  2. var
  3.   strP,strend:string;
  4.   tmpbyte1,tmpbyte2:byte;
  5.   i:integer;
  6.   a,b :Variant;
  7. begin
  8.   strEnd:='asdfasdf';
  9.   for i:=1 to length(strEnd) do
  10.   begin
  11.     a:= byte(strEnd[i]);
  12.     tmpbyte1 := ord(strEnd[i]);
  13.     tmpbyte2:=not tmpbyte1 ;
  14.     b:=not tmpbyte1 ;
  15.     strP:=strP+format('%s',[char(tmpbyte2)]);
  16.     Edit2.Text :=  Edit2.Text + ' ' + VarToStr(a);
  17.     Edit3.Text :=  Edit3.Text + ' ' + VarToStr(b);
  18.   end;
  19.   Edit1.Text :=   strP; //返回值:瀸洐瀸洐
  20. end;
复制代码

这是delphi得到的结果
微信截图_20200114083109.png

转换成JavaScript,得到的结果不一致。
JavaScript的代码
  1. <body>
  2. <p>tmpbyte1:</p>
  3. <p>tmpbyte2:</p>
  4. <div id="infoBoard"></div><br />
  5. <button onclick="readpwd('asdfasdf')">加密</button>
  6. </body>
  7. <script type="text/javascript">
  8. var strP,strend,tmpbyte1,tmpbyte2,i;
  9. var infoBoard=document.getElementById("infoBoard");
  10. var myParagragh = document.getElementsByTagName("p")[0];
  11. var myParagragh1 = document.getElementsByTagName("p")[1];
  12. function readpwd(strEnd){
  13.   for(var i=0;i<strEnd.length;i++){
  14.     tmpbyte1=strEnd[i].charCodeAt();
  15.     tmpbyte2=~tmpbyte1;
  16.     strP=strP+String.fromCharCode(tmpbyte2);
  17.     myParagragh.innerText = myParagragh.innerText + ' ' + tmpbyte1;
  18.     myParagragh1.innerText = myParagragh1.innerText + ' ' + tmpbyte2;
  19.   }
  20.   infoBoard.innerText= 'js加密后:' + strP ;
  21. }
  22. </script>
复制代码
JavaScript的结果
微信截图_20200114083521.png
从上图看出,两个tmpbyte1取反后的值完全不一致。
最佳答案
2020-1-14 09:33:27
tmpbyte1取反后的值不一致可以使用下面的方式,不过你中文字符是通过什么算法出来的不清楚,就没有用JS实现了
<body>
   <p>tmpbyte1:</p>
   <p>tmpbyte2:</p>
   <div id="infoBoard"></div><br />
   <button onclick="readpwd('asdfasdf')">加密</button>
</body>
<script type="text/javascript">
   var strP = '', // JS中不给变量设初始值是 undefined
   strend, tmpbyte1, tmpbyte2, i;
   var infoBoard = document.getElementById("infoBoard");
   var myParagragh = document.getElementsByTagName("p")[0];
   var myParagragh1 = document.getElementsByTagName("p")[1];
   var charMax = 255; // 必需为 ASCII 字符才适合这个加密算法
   
   function readpwd(strEnd) {

      for (var i = 0; i < strEnd.length; i++) {
         tmpbyte1 = strEnd[i].charCodeAt();
         tmpbyte2 = (~tmpbyte1) & charMax;
         tmpbyte2 = parseInt(tmpbyte2.toString(2), 2)
         strP = strP + String.fromCharCode(tmpbyte2);
         myParagragh.innerText = myParagragh.innerText + ' ' + tmpbyte1;
         myParagragh1.innerText = myParagragh1.innerText + ' ' + tmpbyte2;
      }
      infoBoard.innerText = 'js加密后:' + strP;
   }
</script>
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-1-14 08:37:28 | 显示全部楼层
请教大佬,JavaScript应该怎么改才能得到跟delphi一样的结果呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-14 09:33:27 | 显示全部楼层    本楼为最佳答案   
tmpbyte1取反后的值不一致可以使用下面的方式,不过你中文字符是通过什么算法出来的不清楚,就没有用JS实现了
<body>
   <p>tmpbyte1:</p>
   <p>tmpbyte2:</p>
   <div id="infoBoard"></div><br />
   <button onclick="readpwd('asdfasdf')">加密</button>
</body>
<script type="text/javascript">
   var strP = '', // JS中不给变量设初始值是 undefined
   strend, tmpbyte1, tmpbyte2, i;
   var infoBoard = document.getElementById("infoBoard");
   var myParagragh = document.getElementsByTagName("p")[0];
   var myParagragh1 = document.getElementsByTagName("p")[1];
   var charMax = 255; // 必需为 ASCII 字符才适合这个加密算法
   
   function readpwd(strEnd) {

      for (var i = 0; i < strEnd.length; i++) {
         tmpbyte1 = strEnd[i].charCodeAt();
         tmpbyte2 = (~tmpbyte1) & charMax;
         tmpbyte2 = parseInt(tmpbyte2.toString(2), 2)
         strP = strP + String.fromCharCode(tmpbyte2);
         myParagragh.innerText = myParagragh.innerText + ' ' + tmpbyte1;
         myParagragh1.innerText = myParagragh1.innerText + ' ' + tmpbyte2;
      }
      infoBoard.innerText = 'js加密后:' + strP;
   }
</script>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-15 09:50:16 | 显示全部楼层
陈立希2570 发表于 2020-1-14 09:33
tmpbyte1取反后的值不一致可以使用下面的方式,不过你中文字符是通过什么算法出来的不清楚,就没有用JS实现 ...

非常感谢,我折腾了半天,也是实现不了。
我现在用delphi写了一个DLL,用JavaScript可以调用吗?调用的方法是什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-15 15:29:40 | 显示全部楼层
JS 调用不了 DLL文件
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-16 08:40:59 | 显示全部楼层
陈立希2570 发表于 2020-1-15 15:29
JS 调用不了 DLL文件

感谢,我编译了ocx,可以调用了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-16 09:13:49 | 显示全部楼层
xenli 发表于 2020-1-16 08:40
感谢,我编译了ocx,可以调用了。

客气了,没帮到什么呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-5 13:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表