DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: maxding
今日帖子: 39
在线用户: 16
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/5/17 8:16:16
标题:
昨晚才发现AI真可以代码啊!太震撼了。 浏览:1770
加入我的收藏
楼主: 以前以为只能处理一些文本或者图片。
最近在玩perl,用的是文言一心,给定一个具体的代码要求,很快就写出来了,虽然包含一点点低级错误(比如用了use strict;但是后面不用my直接使用变量)。
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/5/17 8:27:12
1楼: 下面是题目:

''' 9 抽抽的图形
规则是这样的:读入四行字符串,其中的字母都是大写的,砳砳想打印一个柱状图显示每个大写字母的频率。你能帮助她吗?
输入格式
输入文件共有4行:每行为一串字符,不超过72个字符。
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!

输出格式
与样例的格式保持严格的一致。
          *
          *
        *          *
        *          *     *   *
        *          *     *   *
*       *     *          *     *   *
*       *     * *     * *   *     * * *
*       *   * * *     * *   * *   * * * *
*     * * * * * *     * * * * *   * * * *     * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
说明:
1.输出的相邻字符间有一个空格。
2.最后一行的26个大写字母每次必须输出。
3.大写字母A所在的第一列前没有空格。
'''
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2024/5/17 8:39:05
2楼: AI条毛!我给个更震撼的给你:
纯体积的换算,初中生的问题,文心一言答了几8毛!
此帖子包含附件:
JPEG 图像
大小:191.0K
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2024/5/17 8:44:47
3楼: 知道为啥吗?百度AI就是认为用它的只有敲代码的,学人用AI画个大腿图,没有别的行业回来问它,所以根本就不会去爬这些答案,因为我这个提问是网上没有的。
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/5/17 9:12:55
4楼: 是有低级错误。但是进步巨大了,毕竟写成了一个能运行的程序啊,几十行代码。而且要准确理解题目意思。

我23年用python写出过这个题目答案,但是当时没有写注释,我现在已经看不懂了,只知道当初是用字符串拼接的方式,而且是在左边拼接,就是新的字符串,添加到原字符串的左边。
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2024/5/17 9:24:15
5楼: 其实是你以为它动脑子想出来的,其实可能是已经有人在网上写过类似的内容了,就好比超级巨大的素材库。
----------------------------------------------
-
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/5/17 9:28:53
6楼: 这个可以把题目要求稍微改一下,测试一下。

我改了,他代码也改了。居然还有注释。
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2024/5/17 9:50:39
7楼: 没啥太大用处,除非网上已有的代码,比方生成一个读写数据的服务,生成一个矩阵类这种烂大街的。但凡啰嗦点的算法,基本上都有点问题。不信你可以让它给你写点比较难的正则表达式,不反复个几遍基本不会对。
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2024/5/17 9:51:42
8楼: 生成测试数据可以用,相当于简化代码测试的工作。
----------------------------------------------
-
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/5/17 10:45:34
9楼: 有些文本性的内容,可以拼凑或者用素材。

但是程序代码的话,逻辑性很强的,中间随便少个符号之类,就没法运行。我感觉AI还是挺厉害的。
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 wszysystem (wszy) ★☆☆☆☆ -
盒子活跃会员
2024/5/17 10:47:54
10楼: 我让它写一个车牌识别的程序,它就写不出来。
----------------------------------------------
-
作者:
男 bighawk (Hawk) ★☆☆☆☆ -
盒子活跃会员
2024/5/17 10:55:51
11楼: 语法的合法性都好说,逻辑性才是AI无法企及的高度。4个字节可以表示的实际事物很多,但是要AI能理解这就不是洪荒之力可以做到的了。出问题最多的情况就是写代码的人以为使用代码的人知道这块内存是当做他以为的那个范围来用,但是用代码的时候往往就扩大化了,会把它用在更广的区域。而我们现代的计算机语言在这方面能起的作用微乎其微。
----------------------------------------------
-
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2024/5/17 12:53:50
12楼: AI能辅助很多中低端重复轮子制造吧。。。
但要玩发动机、航母、火箭等,还是省省吧
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 maidashu (麦大叔) ▲▲△△△ -
普通会员
2024/5/17 13:11:38
13楼: 试了下通义,谷歌的AI,确实比百毒的正确!百毒还是那个德性,人血馒头都忘记了,一直吃一直爽,吃到倒闭!@sail2000
----------------------------------------------
-
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/5/17 13:22:44
14楼: 我们要找出140l/min(升每分钟)对应的立方米每小时是多少。
首先,我们需要了解升和立方米之间的转换关系,以及分钟和小时之间的时间关系。

1立方米(m^3)等于1000升(l)。
1小时(h)等于60分钟(min)。

因此,我们可以使用以下的数学公式进行转换:
(V_l/min × 60 min/h) / 1000 l/m^3 = V_m^3/h
这个公式告诉我们怎样把升每分钟(V_l/min)转化成立方米每小时(V_m^3/h)。

将V_l/min=140代入上式,即可求出答案。
计算结果为:140l/min 是 8.4 立方米/小时。
所以,140l/min对应的立方米每小时是 8.4 m^3/h。

==========
我刚才测试,答案已经改了。140l/min转换为立方米/小时
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2024/5/17 14:13:57
15楼: 也有靠谱的也有很不靠谱的,写一般sql语句还行,写一些常规的代码,例如字符串处理、for in这类迭代对象变量、泛型、回调、匿名函数等代码,这些常规代码有现在解决方案的,但你自己不记得语法或者不记得方法了,AI表现也不错。但写一些多表查询复杂主键的,一般要很多回合才弄得出,而且你要给它思想、方向。在一些比较小众的语言、框架,例如rtc\unigui\lazarus\fmx,它会编造一些根本不存在的方法函数单元等,它的回复基本是一本正经的胡说。
----------------------------------------------
-
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/5/17 19:09:14
16楼: 以前遇到什么问题,都用搜索引擎。我感觉现在,优先用AI,回答结果更好。
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/5/17 20:25:26
17楼: 对编程菜鸟,比如我来说,可以解决80%的问题。

对高手来说,可以解决20%的问题。
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 adongtan (aaabbb) ▲▲▲▲▲ -
普通会员
2024/5/17 20:29:57
18楼: 来来来,AI,
给我写一套类似WIN7的操作系统..
----------------------------------------------
-
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/6/2 18:49:06
19楼: 今天解决 win10 企业版和win7 系统的共享访问问题时,发现https://yiyan.baidu.com/

回答不行。

[Content]
Windows 无法连接到打印机。

[^] 隐藏详细信息(D)  [确定]

[Expanded Information]
操作失败,错误为 0x0000011b。


这个问题,我搜索0x0000011b,找到正确解决方法,内容就在百度自己的百科里。但是,AI回答的,全是空话。
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 bighawk (Hawk) ★☆☆☆☆ -
盒子活跃会员
2024/6/2 19:08:11
20楼: 所谓的 AI,其实就是把国际互联网上所有的相关文本综合起来呈现给你。所以不会有创新,而且答案也可能不是正确的。但是确实可以提高你个人搜索的效率,因为不管如何,重复答案它已经帮忙过滤掉了
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2024/6/2 21:45:31
21楼: 有一点是毋容置疑的:你写段话,它真的能准确理解你表达的是什么意思,从这点来看,又不像它完全没有一点思维能力。
----------------------------------------------
-
作者:
男 hawke2e (hawke2e) ★☆☆☆☆ -
普通会员
2024/6/4 11:23:29
22楼: 可以看我在http://bbs.2ccc.com/topic.asp?topicid=549087
第28楼的贴:
1776年蒸汽机发明,标志着人类掌握把化学能转化成机械能的方法。机器有能量动了。

1936年图灵机发明,标志着机器在没人类参与前提下能处理信息,但现在机器处理过程实质上是人类的思维,机器还不会思考。

2023年chatGPT发明,标志着机器可以脱离人类进行思考,所谓脱离人类的思考,就是会产生人类从未想过的东西,很可能是人类怎么想都想不到的东西。其实从这点就可以知道人类是不知道机器如何思考的,如果知道机器如何思考,机器的思考就脱离不了人类。

****年***机发明,标志着人类(还是机器?)掌握用其它物质制造生命的方法。

事实跟我的预测很吻合!!!
alphago、LLM还有谷歌之前发布的AI都有"思维涌现",标志着机器的思考结果可以超出设计者的控制。
现在的瓶颈个人认为纯粹在于算力还不够强大,也就是成本限制。

最后一个标志预计发生在未来40年左右,而且未来40年内还会发生AI的智力超过人类,所以按此推算,留给人类的时间不多了。

第一台蒸汽机跟现在的内燃机,无论结构、材料、燃料、功能、性能都差别很大,唯独基本原理一样。
相信LLM跟未来的AI也是类似。
----------------------------------------------
软件是什么,相信很多人都说不清。
作者:
男 hawke2e (hawke2e) ★☆☆☆☆ -
普通会员
2024/6/4 12:11:13
23楼: 我觉得:
既然地球不是宇宙的中心,那很可能:人类不是宇宙中最聪明的物种,也不是宇宙中适应能力最强的物种。
如同有些数学理论,普通人因为智力不够理解不了一样,人类也不要试图去理解宇宙的全部,不要试图去寻根问底。

几乎从人类诞生,机器就以“工具”的角色伴随着出现。这几万年里,人类生理结构和智能的进化速度跟机器结构和智能的进化速度相比,没得比。
如同人类不可能受猴子控制一样,智力上超越人类的机器同样不会受人类控制。而,地球只能有一个主人。

所以,归根结底到一个问题上:为什么人类不能像鳄鱼那样,不要企图征服环境,与环境达到一个平衡就算了?
这样人类这物种或许能像鳄鱼那样存在上亿年。
生老病死意外灾难,本就是自然规律;把这一点作为信仰全人类都去信奉,而不是企图去征服自然规律,设立知识和科技的禁区,做好分配制度做到世界大同,或许对于人类这个物种来说是好事。
----------------------------------------------
软件是什么,相信很多人都说不清。
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2024/6/4 20:04:53
24楼: 现代文明起源于日耳曼,推动也是日耳曼,也将毁于日耳曼。
贡献最大和罪恶最大都就麦克斯韦,没他就没电磁波,没电磁波就没现代科技,没现代科技,人类就会按照他本来的样子发展,是现代科技干预和破坏了人类文明的进程。
----------------------------------------------
-
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/6/7 11:18:18
25楼: 我照书上输入下面的简单代码,发现不能运行(后来发现有个小错误),整个粘贴给AI

<!DOCTYPE html>
<html>

<head>
    <script>
        function displaykey(e) {
          if (e.keyCode) {
          var keyCode = e.keyCode;
          } else {
          var keyCode = e.which;
          }
          character = String.fromCharCode(keyCode);
          var keysParagraph = document.getElementById('keys');
          keysParagraph.innerHTML += character;
        }


    </script>
</head>

<body onkeypress="displaykey(Event);">
    <p>this</p>
    <div id="keys"></div>
</body>

</html>

===下面是回复,真是好帮手==========

这个HTML文档尝试实现一个功能:当用户在浏览器窗口的任意位置按下一个键时,该键对应的字符会被追加到页面上一个ID为keys的div元素中。但是,有一个小错误需要修正。

在onkeypress属性中,Event应该小写为event,因为在JavaScript中,事件对象通常作为event参数传递给事件处理函数。此外,考虑到keyCode在一些新版本的浏览器中已经不被推荐使用,我们可以使用key属性,它直接给出了按键的字符(如果适用)。

这里是修正后的代码:

<!DOCTYPE html>  
<html>  
  
<head>  
    <script>  
        function displaykey(e) {  
          // 优先使用e.key,因为它提供了按键的字符(如果适用)  
          var character = e.key || String.fromCharCode(e.keyCode || e.which);  
          var keysParagraph = document.getElementById('keys');  
          keysParagraph.innerHTML += character;  
        }  
    </script>  
</head>  
  
<body onkeypress="displaykey(event);">  
    <p>Press a key to see it displayed here:</p>  
    <div id="keys"></div>  
</body>  
  
</html>

注意,我也添加了一个<p>标签来为用户提供一些指导,告诉他们应该做什么。另外,我使用了e.key || String.fromCharCode(e.keyCode || e.which)来首先尝试获取e.key,如果它不存在(例如,在某些特殊键的情况下),则回退到使用keyCode或which。
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/6/7 21:08:01
26楼: function traverseObjectProperties(obj, path = '') {  
    for (let key in obj) {  
        if (obj.hasOwnProperty(key)) {  
          // 输出当前路径和属性名  
          console.log(`${path}${key}`);  
  
          // 如果是对象或数组,则递归遍历  
          if (typeof obj[key] === 'object' && obj[key] !== null) {  
          traverseObjectProperties(obj[key], `${path}${key}.`);  
          }  
        }  
    }  
}  
  

这个js函数也是ai回答的,我不理解里面的
`${path}${key}`

用法,再问一下后,回答
${...} 是模板字符串(Template Literals)的语法,它允许你嵌入表达式,这些表达式在字符串被创建时会被求值并转换为字符串。


模板字符串在JavaScript中是用反引号(backticks,即`)引用起来的。



AI像个小老师。
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 ufo2003 (ufo) ★☆☆☆☆ -
普通会员
2024/6/7 22:40:40
27楼: AI不是简单的搜索统计网上的语料。而是进行了复杂的维度统计,假设一个苹果,AI可能有几百上千个维度与之相关,如颜色、香味、形状、产地、历史、味道、季节、手机、成分、营养、文化……,然后根据上下文取概率最大的来输出
----------------------------------------------
delphi
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/6/8 9:21:36
28楼: 是的,比搜索高一级了。

今天想把以前自己做的软件注册生成程序改成js代码。
自己写的普通小函数,简单函数,百度可以直接转换,MD5之类网上也有现成的js代码或者库。
但是用到第三方复杂的函数,输入到百度的文本框里好像超过长度了,底部显示2000/2000

可能是需要开通会员,可以输入5000字。

//**********
//*Des加密算法

//*王锐(wr960204武稀松)2002-3-15
//*Email:wr****@x263.net
//*QQ:4*****3
//**********
unit WNDES;
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/6/8 9:27:30
29楼: 这个js办法不行的话,只能采用PHP中直接调用服务器端的EXE程序并获取其输出结果了。
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/6/8 14:54:12
30楼: 不是整个pas转换,用一段一段转换的方式,控制在2000个字符以内,让AI分次转换了一下。
现在试试能不能组合起来,代码运行效果和delphi里一样。
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/6/8 17:43:20
31楼:
unit WNDES;

interface

uses
  Windows, Messages, ShlObj, WinSock, IniFiles, ActiveX, SysUtils,
  Classes, Graphics, Controls, Forms, Dialogs;

type
  TKeyByte = array[0..5] of Byte;
  TDesMode = (dmEncry, dmDESry);
const
  BitIP: array[0..63] of Byte =
  (57, 49, 41, 33, 25, 17, 9, 1,
    59, 51, 43, 35, 27, 19, 11, 3,
    61, 53, 45, 37, 29, 21, 13, 5,
    63, 55, 47, 39, 31, 23, 15, 7,
    56, 48, 40, 32, 24, 16, 8, 0,
    58, 50, 42, 34, 26, 18, 10, 2,
    60, 52, 44, 36, 28, 20, 12, 4,
    62, 54, 46, 38, 30, 22, 14, 6);

  BitCP: array[0..63] of Byte =
  (39, 7, 47, 15, 55, 23, 63, 31,
    38, 6, 46, 14, 54, 22, 62, 30,
    37, 5, 45, 13, 53, 21, 61, 29,
    36, 4, 44, 12, 52, 20, 60, 28,
    35, 3, 43, 11, 51, 19, 59, 27,
    34, 2, 42, 10, 50, 18, 58, 26,
    33, 1, 41, 9, 49, 17, 57, 25,
    32, 0, 40, 8, 48, 16, 56, 24);

  BitExp: array[0..47] of Integer =
  (31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 7, 8, 9, 10,
    11, 12, 11, 12, 13, 14, 15, 16, 15, 16, 17, 18, 19, 20, 19, 20,
    21, 22, 23, 24, 23, 24, 25, 26, 27, 28, 27, 28, 29, 30, 31, 0);

  BitPM: array[0..31] of Byte =
  (15, 6, 19, 20, 28, 11, 27, 16, 0, 14, 22, 25, 4, 17, 30, 9,
    1, 7, 23, 13, 31, 26, 2, 8, 18, 12, 29, 5, 21, 10, 3, 24);

  sBox: array[0..7] of array[0..63] of Byte =
  ((14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
    0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
    4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
    15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13),

    (15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
    3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
    0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
    13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9),

    (10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
    13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
    13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
    1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12),

    (7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
    13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
    10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
    3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14),

    (2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
    14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
    4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
    11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3),

    (12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
    10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
    9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
    4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13),

    (4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
    13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
    1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
    6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12),

    (13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
    1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
    7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
    2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11));

  BitPMC1: array[0..55] of Byte =
  (56, 48, 40, 32, 24, 16, 8,
    0, 57, 49, 41, 33, 25, 17,
    9, 1, 58, 50, 42, 34, 26,
    18, 10, 2, 59, 51, 43, 35,
    62, 54, 46, 38, 30, 22, 14,
    6, 61, 53, 45, 37, 29, 21,
    13, 5, 60, 52, 44, 36, 28,
    20, 12, 4, 27, 19, 11, 3);

  BitPMC2: array[0..47] of Byte =
  (13, 16, 10, 23, 0, 4,
    2, 27, 14, 5, 20, 9,
    22, 18, 11, 3, 25, 7,
    15, 6, 26, 19, 12, 1,
    40, 51, 30, 36, 46, 54,
    29, 39, 50, 44, 32, 47,
    43, 48, 38, 55, 33, 52,
    45, 41, 49, 35, 28, 31);
  //////////DES加密算法//////////
function EncryStr(Str, Key: string): string; //加密
function EncryStrHex(Str, Key: string): string;
//以十六进制加密(有些时侯加密的密文含有特殊字符文本框不能显示、数据库文本字段也不能存储。以十六进制形式表示可保证绝对不会出现该种情况)
function DESryStr(Str, Key: string): string; //解密
function DESryStrHex(StrHex, Key: string): string; //解密十六进制加密的密文

var
  subKey: array[0..15] of TKeyByte;
implementation

procedure initPermutation(var inData: array of Byte);
var
  newData: array[0..7] of Byte;
  i: Integer;
begin
  FillChar(newData, 8, 0);
  for i := 0 to 63 do
    if (inData[BitIP[i] shr 3] and (1 shl (7 - (BitIP[i] and $07)))) <> 0 then
      newData[i shr 3] := newData[i shr 3] or (1 shl (7 - (i and $07)));
  for i := 0 to 7 do
    inData[i] := newData[i];
end;

procedure conversePermutation(var inData: array of Byte);
var
  newData: array[0..7] of Byte;
  i: Integer;
begin
  FillChar(newData, 8, 0);
  for i := 0 to 63 do
    if (inData[BitCP[i] shr 3] and (1 shl (7 - (BitCP[i] and $07)))) <> 0 then
      newData[i shr 3] := newData[i shr 3] or (1 shl (7 - (i and $07)));
  for i := 0 to 7 do
    inData[i] := newData[i];
end;

procedure expand(inData: array of Byte; var outData: array of Byte);
var
  i: Integer;
begin
  FillChar(outData, 6, 0);
  for i := 0 to 47 do
    if (inData[BitExp[i] shr 3] and (1 shl (7 - (BitExp[i] and $07)))) <> 0 then
      outData[i shr 3] := outData[i shr 3] or (1 shl (7 - (i and $07)));
end;

procedure permutation(var inData: array of Byte);
var
  newData: array[0..3] of Byte;
  i: Integer;
begin
  FillChar(newData, 4, 0);
  for i := 0 to 31 do
    if (inData[BitPM[i] shr 3] and (1 shl (7 - (BitPM[i] and $07)))) <> 0 then
      newData[i shr 3] := newData[i shr 3] or (1 shl (7 - (i and $07)));
  for i := 0 to 3 do
    inData[i] := newData[i];
end;

function si(s, inByte: Byte): Byte;
var
  c: Byte;
begin
  c := (inByte and $20) or ((inByte and $1E) shr 1) or
    ((inByte and $01) shl 4);
  Result := (sBox[s][c] and $0F);
end;

procedure permutationChoose1(inData: array of Byte;
  var outData: array of Byte);
var
  i: Integer;
begin
  FillChar(outData, 7, 0);
  for i := 0 to 55 do
    if (inData[BitPMC1[i] shr 3] and (1 shl (7 - (BitPMC1[i] and $07)))) <> 0
      then
      outData[i shr 3] := outData[i shr 3] or (1 shl (7 - (i and $07)));
end;

procedure permutationChoose2(inData: array of Byte;
  var outData: array of Byte);
var
  i: Integer;
begin
  FillChar(outData, 6, 0);
  for i := 0 to 47 do
    if (inData[BitPMC2[i] shr 3] and (1 shl (7 - (BitPMC2[i] and $07)))) <> 0
      then
      outData[i shr 3] := outData[i shr 3] or (1 shl (7 - (i and $07)));
end;

procedure cycleMove(var inData: array of Byte; bitMove: Byte);
var
  i: Integer;
begin
  for i := 0 to bitMove - 1 do
  begin
    inData[0] := (inData[0] shl 1) or (inData[1] shr 7);
    inData[1] := (inData[1] shl 1) or (inData[2] shr 7);
    inData[2] := (inData[2] shl 1) or (inData[3] shr 7);
    inData[3] := (inData[3] shl 1) or ((inData[0] and $10) shr 4);
    inData[0] := (inData[0] and $0F);
  end;
end;

procedure makeKey(inKey: array of Byte; var outKey: array of TKeyByte);
const
  bitDisplace: array[0..15] of Byte =
  (1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1);
var
  outData56: array[0..6] of Byte;
  key28l: array[0..3] of Byte;
  key28r: array[0..3] of Byte;
  key56o: array[0..6] of Byte;
  i: Integer;
begin
  permutationChoose1(inKey, outData56);

  key28l[0] := outData56[0] shr 4;
  key28l[1] := (outData56[0] shl 4) or (outData56[1] shr 4);
  key28l[2] := (outData56[1] shl 4) or (outData56[2] shr 4);
  key28l[3] := (outData56[2] shl 4) or (outData56[3] shr 4);
  key28r[0] := outData56[3] and $0F;
  key28r[1] := outData56[4];
  key28r[2] := outData56[5];
  key28r[3] := outData56[6];

  for i := 0 to 15 do
  begin
    cycleMove(key28l, bitDisplace[i]);
    cycleMove(key28r, bitDisplace[i]);
    key56o[0] := (key28l[0] shl 4) or (key28l[1] shr 4);
    key56o[1] := (key28l[1] shl 4) or (key28l[2] shr 4);
    key56o[2] := (key28l[2] shl 4) or (key28l[3] shr 4);
    key56o[3] := (key28l[3] shl 4) or (key28r[0]);
    key56o[4] := key28r[1];
    key56o[5] := key28r[2];
    key56o[6] := key28r[3];
    permutationChoose2(key56o, outKey[i]);
  end;
end;

procedure encry(inData, subKey: array of Byte;
  var outData: array of Byte);
var
  outBuf: array[0..5] of Byte;
  buf: array[0..7] of Byte;
  i: Integer;
begin
  expand(inData, outBuf);
  for i := 0 to 5 do
    outBuf[i] := outBuf[i] xor subKey[i];
  // outBuf       xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
  buf[0] := outBuf[0] shr 2; //xxxxxx -> 2
  buf[1] := ((outBuf[0] and $03) shl 4) or (outBuf[1] shr 4);
  // 4 <- xx xxxx -> 4
  buf[2] := ((outBuf[1] and $0F) shl 2) or (outBuf[2] shr 6);
  //        2 <- xxxx xx -> 6
  buf[3] := outBuf[2] and $3F; //          xxxxxx
  buf[4] := outBuf[3] shr 2; //          xxxxxx
  buf[5] := ((outBuf[3] and $03) shl 4) or (outBuf[4] shr 4);
  //          xx xxxx
  buf[6] := ((outBuf[4] and $0F) shl 2) or (outBuf[5] shr 6);
  //          xxxx xx
  buf[7] := outBuf[5] and $3F;
  //          xxxxxx
  for i := 0 to 7 do
    buf[i] := si(i, buf[i]);
  for i := 0 to 3 do
    outBuf[i] := (buf[i * 2] shl 4) or buf[i * 2 + 1];
  permutation(outBuf);
  for i := 0 to 3 do
    outData[i] := outBuf[i];
end;

procedure desData(desMode: TDesMode;
  inData: array of Byte; var outData: array of Byte);
// inData, outData 都为8Bytes,否则出错
var
  i, j: Integer;
  temp, buf: array[0..3] of Byte;
begin
  for i := 0 to 7 do
    outData[i] := inData[i];
  initPermutation(outData);
  if desMode = dmEncry then
  begin
    for i := 0 to 15 do
    begin
      for j := 0 to 3 do
        temp[j] := outData[j]; //temp = Ln
      for j := 0 to 3 do
        outData[j] := outData[j + 4]; //Ln+1 = Rn
      encry(outData, subKey[i], buf); //Rn ==Kn==> buf
      for j := 0 to 3 do
        outData[j + 4] := temp[j] xor buf[j]; //Rn+1 = Ln^buf
    end;

    for j := 0 to 3 do
      temp[j] := outData[j + 4];
    for j := 0 to 3 do
      outData[j + 4] := outData[j];
    for j := 0 to 3 do
      outData[j] := temp[j];
  end
  else if desMode = dmDESry then
  begin
    for i := 15 downto 0 do
    begin
      for j := 0 to 3 do
        temp[j] := outData[j];
      for j := 0 to 3 do
        outData[j] := outData[j + 4];
      encry(outData, subKey[i], buf);
      for j := 0 to 3 do
        outData[j + 4] := temp[j] xor buf[j];
    end;
    for j := 0 to 3 do
      temp[j] := outData[j + 4];
    for j := 0 to 3 do
      outData[j + 4] := outData[j];
    for j := 0 to 3 do
      outData[j] := temp[j];
  end;
  conversePermutation(outData);
end;

function EncryStr(Str, Key: string): string;
var
  StrByte, OutByte, KeyByte: array[0..7] of Byte;
  StrResult: string;
  I, J: Integer;
begin
  if (Length(Str) > 0) and (Ord(Str[Length(Str)]) = 0) then
    raise Exception.Create('Error: the last char is NULL char.');
  if Length(Key) < 8 then
    while Length(Key) < 8 do
      Key := Key + Chr(0);
  while Length(Str) mod 8 <> 0 do
    Str := Str + Chr(0);

  for J := 0 to 7 do
    KeyByte[J] := Ord(Key[J + 1]);
  makeKey(keyByte, subKey);

  StrResult := '';

  for I := 0 to Length(Str) div 8 - 1 do
  begin
    for J := 0 to 7 do
      StrByte[J] := Ord(Str[I * 8 + J + 1]);
    desData(dmEncry, StrByte, OutByte);
    for J := 0 to 7 do
      StrResult := StrResult + Chr(OutByte[J]);
  end;

  Result := StrResult;
end;

function DESryStr(Str, Key: string): string;
var
  StrByte, OutByte, KeyByte: array[0..7] of Byte;
  StrResult: string;
  I, J: Integer;
begin
  if Length(Key) < 8 then
    while Length(Key) < 8 do
      Key := Key + Chr(0);

  for J := 0 to 7 do
    KeyByte[J] := Ord(Key[J + 1]);
  makeKey(keyByte, subKey);

  StrResult := '';

  for I := 0 to Length(Str) div 8 - 1 do
  begin
    for J := 0 to 7 do
      StrByte[J] := Ord(Str[I * 8 + J + 1]);
    desData(dmDESry, StrByte, OutByte);
    for J := 0 to 7 do
      StrResult := StrResult + Chr(OutByte[J]);
  end;
  while (Length(StrResult) > 0) and
    (Ord(StrResult[Length(StrResult)]) = 0) do
    Delete(StrResult, Length(StrResult), 1);
  Result := StrResult;
end;

//////////

function EncryStrHex(Str, Key: string): string;
var
  StrResult, TempResult, Temp: string;
  I: Integer;
begin
  TempResult := EncryStr(Str, Key);
  StrResult := '';
  for I := 0 to Length(TempResult) - 1 do
  begin
    Temp := Format('%x', [Ord(TempResult[I + 1])]);
    if Length(Temp) = 1 then
      Temp := '0' + Temp;
    StrResult := StrResult + Temp;
  end;
  Result := StrResult;
end;

function DESryStrHex(StrHex, Key: string): string;
  function HexToInt(Hex: string): Integer;
  var
    I, Res: Integer;
    ch: Char;
  begin
    Res := 0;
    for I := 0 to Length(Hex) - 1 do
    begin
      ch := Hex[I + 1];
      if (ch >= '0') and (ch <= '9') then
        Res := Res * 16 + Ord(ch) - Ord('0')
      else if (ch >= 'A') and (ch <= 'F') then
        Res := Res * 16 + Ord(ch) - Ord('A') + 10
      else if (ch >= 'a') and (ch <= 'f') then
        Res := Res * 16 + Ord(ch) - Ord('a') + 10
      else
        raise Exception.Create('Error: not a Hex String');
    end;
    Result := Res;
  end;

var
  Str, Temp: string;
  I: Integer;
begin
  Str := '';
  for I := 0 to Length(StrHex) div 2 - 1 do
  begin
    Temp := Copy(StrHex, I * 2 + 1, 2);
    Str := Str + Chr(HexToInt(Temp));
  end;
  Result := DESryStr(Str, Key);
end;

end.
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/6/8 17:50:27
32楼: js文件内容
// Delphi 中的 Byte 数组在 JavaScript 中可以使用 Uint8Array 或者简单的数组来表示  
// 但这里我们使用简单的数组,因为 Uint8Array 可能需要额外的处理  

//下面这行提示错误,导致116行也只能修改
//type TKeyByte = [number, number, number, number, number, number];

// 枚举在 JavaScript 中可以使用对象或字符串常量来表示  
// 这里我们使用对象  
const TDesMode = {
  dmEncry: 'dmEncry',
  dmDESry: 'dmDESry' // 注意:这里的 'dmDESry' 可能是个错误,通常应该是 'dmDecry' 或其他表示解密的意思  
};

const BitIP = [
  57, 49, 41, 33, 25, 17, 9, 1,
  59, 51, 43, 35, 27, 19, 11, 3,
  61, 53, 45, 37, 29, 21, 13, 5,
  63, 55, 47, 39, 31, 23, 15, 7,
  56, 48, 40, 32, 24, 16, 8, 0,
  58, 50, 42, 34, 26, 18, 10, 2,
  60, 52, 44, 36, 28, 20, 12, 4,
  62, 54, 46, 38, 30, 22, 14, 6
];

const BitCP = [
  39, 7, 47, 15, 55, 23, 63, 31,
  38, 6, 46, 14, 54, 22, 62, 30,
  37, 5, 45, 13, 53, 21, 61, 29,
  36, 4, 44, 12, 52, 20, 60, 28,
  35, 3, 43, 11, 51, 19, 59, 27,
  34, 2, 42, 10, 50, 18, 58, 26,
  33, 1, 41, 9, 49, 17, 57, 25,
  32, 0, 40, 8, 48, 16, 56, 24
];

const BitExp = [
  31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 7, 8, 9, 10,
  11, 12, 11, 12, 13, 14, 15, 16, 15, 16, 17, 18, 19, 20, 19, 20,
  21, 22, 23, 24, 23, 24, 25, 26, 27, 28, 27, 28, 29, 30, 31, 0
];

const BitPM = [
  15, 6, 19, 20, 28, 11, 27, 16, 0, 14, 22, 25, 4, 17, 30, 9,
  1, 7, 23, 13, 31, 26, 2, 8, 18, 12, 29, 5, 21, 10, 3, 24
];


//Uint8Array(每个内部数组都是一个 Uint8Array)
let sBox = [
  new Uint8Array([14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
    0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
    4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
    15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]),
  new Uint8Array([15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
    3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
    0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
    13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]),

  new Uint8Array([10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
    13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
    13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
    1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]),

  new Uint8Array([7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
    13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
    10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
    3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]),

  new Uint8Array([2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
    14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
    4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
    11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]),

  new Uint8Array([12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
    10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
    9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
    4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]),

  new Uint8Array([4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
    13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
    1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
    6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]),

  new Uint8Array([13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
    1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
    7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
    2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11])
];

// BitPMC1 转换为 JavaScript 数组  
let BitPMC1 = [
  56, 48, 40, 32, 24, 16, 8,
  0, 57, 49, 41, 33, 25, 17,
  9, 1, 58, 50, 42, 34, 26,
  18, 10, 2, 59, 51, 43, 35,
  62, 54, 46, 38, 30, 22, 14,
  6, 61, 53, 45, 37, 29, 21,
  13, 5, 60, 52, 44, 36, 28,
  20, 12, 4, 27, 19, 11, 3
];

// BitPMC2 转换为 JavaScript 数组  
let BitPMC2 = [
  13, 16, 10, 23, 0, 4,
  2, 27, 14, 5, 20, 9,
  22, 18, 11, 3, 25, 7,
  15, 6, 26, 19, 12, 1,
  40, 51, 30, 36, 46, 54,
  29, 39, 50, 44, 32, 47,
  43, 48, 38, 55, 33, 52,
  45, 41, 49, 35, 28, 31
];


// 使用 Uint8Array 来表示一个长度为16的字节数组  
var subKey = new Uint8Array(16);
//var subKey = TKeyByte;有错误提示只能修改成上面的

//type TKeyByte = [number, number, number, number, number, number];

// Uint8Array 确保每个元素都是一个字节(0-255)

// 初始化置换  
function initPermutation(inData) {
  let newData = new Uint8Array(8); // 初始化为8个0  
  for (let i = 0; i < 64; i++) {
    if ((inData[Math.floor(BitIP[i] / 8)] & (1 << (7 - (BitIP[i] % 8)))) !== 0) {
      newData[Math.floor(i / 8)] |= (1 << (7 - (i % 8)));
    }
  }
  for (let i = 0; i < 8; i++) {
    inData[i] = newData[i];
  }
}

// 逆置换  
function conversePermutation(inData) {
  let newData = new Uint8Array(8); // 初始化为8个0  
  for (let i = 0; i < 64; i++) {
    if ((inData[Math.floor(BitCP[i] / 8)] & (1 << (7 - (BitCP[i] % 8)))) !== 0) {
      newData[Math.floor(i / 8)] |= (1 << (7 - (i % 8)));
    }
  }
  for (let i = 0; i < 8; i++) {
    inData[i] = newData[i];
  }
}

// 扩展  
function expand(inData, outData) {
  for (let i = 0; i < 6; i++) {
    outData[i] = 0; // 初始化为0  
  }
  for (let i = 0; i < 48; i++) {
    if ((inData[Math.floor(BitExp[i] / 8)] & (1 << (7 - (BitExp[i] % 8)))) !== 0) {
      outData[Math.floor(i / 8)] |= (1 << (7 - (i % 8)));
    }
  }
}

// 置换  
function permutation(inData) {
  let newData = new Uint8Array(4); // 初始化为4个0  
  for (let i = 0; i < 32; i++) {
    if ((inData[Math.floor(BitPM[i] / 8)] & (1 << (7 - (BitPM[i] % 8)))) !== 0) {
      newData[Math.floor(i / 8)] |= (1 << (7 - (i % 8)));
    }
  }
  for (let i = 0; i < 4; i++) {
    inData[i] = newData[i];
  }
}

// si 函数  
function si(s, inByte) {
  let c = ((inByte & 0x20) | ((inByte & 0x1E) >> 1) | ((inByte & 0x01) << 4));
  return (sBox[s][c] & 0x0F);
}

// 置换选择1  
function permutationChoose1(inData, outData) {
  for (let i = 0; i < 7; i++) {
    outData[i] = 0; // 初始化为0  
  }
  for (let i = 0; i < 56; i++) { // 注意:由于BitPMC1是0..55,所以这里只需要到55  
    if ((inData[Math.floor(BitPMC1[i] / 8)] & (1 << (7 - (BitPMC1[i] % 8)))) !== 0) {
      outData[Math.floor(i / 8)] |= (1 << (7 - (i % 8)));
    }
  }
}

function permutationChoose2(inData, outData) {  
  // 假设inData和outData都是Uint8Array类型  
  // 初始化outData数组
  outData = [];  
  for (let i = 0; i < 6; i++) {
    outData[i] = 0; // 初始化为0  
  } 
  
  // 假设BitPMC2是一个包含所需索引的数组,且已经定义  
  // 这里我们使用一个模拟的BitPMC2数组  
  // var BitPMC2 = ...; // 你需要定义这个数组,它应该包含0到47的索引  
  
  // 遍历inData并设置outData的相应位  
  for (let i = 0; i <= 47; i++) {  
    // 假设BitPMC2[i]返回的是一个索引,我们需要从inData中获取该索引对应的字节  
    // 并检查特定位是否被设置  
    const byteIndex = Math.floor(BitPMC2[i] / 8); // 将索引转换为字节索引  
    const bitOffset = 7 - (BitPMC2[i] & 0x07); // 计算位偏移量  
    const bitMask = 1 << bitOffset; // 创建位掩码  
  
    // 检查inData中对应位是否被设置  
    if ((inData[byteIndex] & bitMask) !== 0) {  
      // 如果设置了,则在outData的相应位置设置位  
      outData[Math.floor(i / 8)] |= 1 << (7 - (i & 0x07));  
    }  
  }  
}  
  

// 注意:在JavaScript中,数组作为参数传递时是按引用传递的,  
// 所以你可以直接修改传入的数组而不需要返回它(除非你想返回一个新的数组
//将您提供的 Delphi 代码转换为 JavaScript 代码如下。注意,我假设 TKeyByte 在 Delphi 中是一个包含 8 位字节的自定义类型,但在 JavaScript 中,我们通常使用 Uint8Array 来表示字节数组。同时,我也假设 permutationChoose1 和 permutationChoose2 这两个过程已经在其他地方定义,因为您没有提供它们的实现。

// 循环移位  
function cycleMove(inData, bitMove) {
  for (let i = 0; i < bitMove; i++) {
    let temp = (inData[0] << 1) | ((inData[1] & 0x80) >>> 7); // 注意使用 >>> 进行无符号右移  
    inData[1] = (inData[1] << 1) | ((inData[2] & 0x80) >>> 7);
    inData[2] = (inData[2] << 1) | ((inData[3] & 0x80) >>> 7);
    inData[3] = ((inData[3] << 1) | (inData[0] & 0x10)) & 0x7F; // 保留低 7 位  
    inData[0] = temp & 0x0F; // 保留低 4 位  
  }
}

// 制作密钥  
function makeKey(inKey, outKey) {
  const bitDisplace = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1];
  let outData56 = new Uint8Array(7);
  let key28l = new Uint8Array(4);
  let key28r = new Uint8Array(4);
  let key56o = new Uint8Array(7);

  // 假设 permutationChoose1 是可用的  
  permutationChoose1(inKey, outData56);

  // 分割 outData56 到 key28l 和 key28r  
  key28l[0] = outData56[0] >>> 4;
  key28l[1] = ((outData56[0] & 0x0F) << 4) | (outData56[1] >>> 4);
  key28l[2] = ((outData56[1] & 0x0F) << 4) | (outData56[2] >>> 4);
  key28l[3] = ((outData56[2] & 0x0F) << 4) | (outData56[3] >>> 4);
  key28r[0] = outData56[3] & 0x0F;
  key28r.set(outData56.slice(4, 7), 1); // 复制 outData56[4] 到 key28r[1...3]  

  // 进行循环移位和置换  
  for (let i = 0; i < 16; i++) {
    cycleMove(key28l, bitDisplace[i]);
    cycleMove(key28r, bitDisplace[i]);

    // 合并 key28l 和 key28r 到 key56o  
    key56o[0] = (key28l[0] << 4) | (key28l[1] >>> 4);
    key56o[1] = ((key28l[1] & 0x0F) << 4) | (key28l[2] >>> 4);
    key56o[2] = ((key28l[2] & 0x0F) << 4) | (key28l[3] >>> 4);
    key56o[3] = ((key28l[3] & 0x0F) << 4) | key28r[0];
    key56o.set(key28r.slice(1, 4), 4); // 复制 key28r[1...3] 到 key56o[4...6]  

    // 假设 permutationChoose2 是可用的  
    permutationChoose2(key56o, outKey[i]);
  }
}

function encry(inData, subKey, outData) {
  const outBuf = new Uint8Array(6); // 假设 expand 函数返回 6 个字节  
  const buf = new Uint8Array(8);

  // 调用 expand 函数(需要实现)  
  expand(inData, outBuf);

  // 对 outBuf 应用 XOR 操作  
  for (let i = 0; i < 6; i++) {
    outBuf[i] ^= subKey[i];
  }

  // 字节操作  
  buf[0] = outBuf[0] >>> 2; // 逻辑右移 2 位  
  buf[1] = ((outBuf[0] & 0x03) << 4) | (outBuf[1] >>> 4);
  buf[2] = ((outBuf[1] & 0x0F) << 2) | (outBuf[2] >>> 6);
  buf[3] = outBuf[2] & 0x3F;
  buf[4] = outBuf[3] >>> 2;
  buf[5] = ((outBuf[3] & 0x03) << 4) | (outBuf[4] >>> 4);
  buf[6] = ((outBuf[4] & 0x0F) << 2) | (outBuf[5] >>> 6);
  buf[7] = outBuf[5] & 0x3F;

  // 调用 si 函数(需要实现)  
  for (let i = 0; i < 8; i++) {
    buf[i] = si(i, buf[i]);
  }

  // 合并 buf 到 outBuf  
  for (let i = 0; i < 4; i++) {
    outBuf[i] = (buf[i * 2] << 4) | buf[i * 2 + 1];
  }

  // 调用 permutation 函数(需要实现)  
  permutation(outBuf);

  // 将结果复制到 outData  
  for (let i = 0; i < 4; i++) {
    outData[i] = outBuf[i];
  }
}

function desData(desMode, inData, outData) {
  // 假设 inData 和 outData 都是 Uint8Array(8)  
  for (let i = 0; i < 8; i++) {
    outData[i] = inData[i];
  }

  initPermutation(outData);

  const temp = new Uint8Array(4);
  const buf = new Uint8Array(4);

  if (desMode === 'dmEncry') {
    for (let i = 0; i < 16; i++) {
      // temp = Ln  
      for (let j = 0; j < 4; j++) {
        temp[j] = outData[j];
      }
      // Ln+1 = Rn  
      for (let j = 0; j < 4; j++) {
        outData[j] = outData[j + 4];
      }
      // Rn ==Kn==> buf  
      encry(outData.slice(0, 4), subKey[i], buf);
      // Rn+1 = Ln ^ buf  
      for (let j = 0; j < 4; j++) {
        outData[j + 4] = temp[j] ^ buf[j];
      }
    }

    // Swap halves  
    for (let j = 0; j < 4; j++) {
      temp[j] = outData[j + 4];
    }
    for (let j = 0; j < 4; j++) {
      outData[j + 4] = outData[j];
    }
    for (let j = 0; j < 4; j++) {
      outData[j] = temp[j];
    }
  } else if (desMode === 'dmDESry') {
    for (let i = 15; i >= 0; i--) {
      for (let j = 0; j < 4; j++) {
        temp[j] = outData[j];
      }
      for (let j = 0; j < 4; j++) {
        outData[j] = outData[j + 4];
      }
      encry(outData.slice(0, 4), subKey[i], buf);
      for (let j = 0; j < 4; j++) {
        outData[j + 4] = temp[j] ^ buf[j];
      }
    }

    // Swap halves  
    for (let j = 0; j < 4; j++) {
      temp[j] = outData[j + 4];
    }
    for (let j = 0; j < 4; j++) {
      outData[j + 4] = outData[j];
    }
    for (let j = 0; j < 4; j++) {
      outData[j] = temp[j];
    }
  }

  conversePermutation(outData);
}

function padString(str, blockSize) {
  // 填充字符串以使其长度为 blockSize 的倍数  
  const padding = blockSize - (str.length % blockSize);
  return str + '\0'.repeat(padding); // 使用空字符填充  
}

function unpadString(str) {
  // 移除字符串末尾的空字符  
  let idx = str.length - 1;
  while (idx >= 0 && str.charCodeAt(idx) === 0) {
    idx--;
  }
  return str.substring(0, idx + 1);
}


function EncryStr(Str, Key) {
  if (Str.charCodeAt(Str.length - 1) === 0) {
    throw new Error('Error: the last char is NULL char.');
  }

  Key = padString(Key, 8); // 确保 Key 长度为 8 字节  
  Str = padString(Str, 8); // 填充字符串使其长度为 8 的倍数  

  const keyByte = new Uint8Array(8);
  for (let i = 0; i < 8; i++) {
    keyByte[i] = Key.charCodeAt(i);
  }

  const subKey = []; // 需要提前初始化或生成  
  makeKey(keyByte, subKey);

  let StrResult = '';

  for (let i = 0; i < Str.length; i += 8) {
    const StrByte = new Uint8Array(8);
    for (let j = 0; j < 8; j++) {
      StrByte[j] = Str.charCodeAt(i + j);
    }

    const OutByte = new Uint8Array(8);
    desData('dmEncry', StrByte, OutByte);

    for (let j = 0; j < 8; j++) {
      StrResult += String.fromCharCode(OutByte[j]);
    }
  }

  return StrResult;
}

function DESryStr(Str, Key) {
  Key = padString(Key, 8); // 确保 Key 长度为 8 字节  

  const keyByte = new Uint8Array(8);
  for (let i = 0; i < 8; i++) {
    keyByte[i] = Key.charCodeAt(i);
  }

  const subKey = []; // 需要提前初始化或生成  
  makeKey(keyByte, subKey);

  let StrResult = '';

  for (let i = 0; i < Str.length; i += 8) {
    const StrByte = new Uint8Array(8);
    for (let j = 0; j < 8 && i + j < Str.length; j++) {
      StrByte[j] = Str.charCodeAt(i + j);
    }

    const OutByte = new Uint8Array(8);
    desData('dmDESry', StrByte, OutByte);

    for (let j = 0; j < 8; j++) {
      if (i + j < Str.length) { // 只添加原始字符串中有的字符  
        StrResult += String.fromCharCode(OutByte[j]);
      }
    }
  }

  return unpadString(StrResult); // 移除末尾的空字符  
}

//字符串填充和去填充函数 padString 和 unpadString 分别用于确保输入字符串长度为 8 的倍数以及移除解密后字符串末尾可能
//以下是EncryStrHex和DESryStrHex函数的JavaScript实现:

function EncryStrHex(Str, Key) {

  // 加密字符串  
  let TempResult = EncryStr(Str, Key);
  let StrResult = '';

  // 将每个字符转换为十六进制并添加到结果字符串中  
  for (let i = 0; i < TempResult.length; i++) {
    let hex = TempResult.charCodeAt(i).toString(16);
    if (hex.length === 1) {
      hex = '0' + hex;
    }
    StrResult += hex;
  }

  return StrResult;
}

function HexToInt(Hex) {
  let res = 0;
  for (let i = 0; i < Hex.length; i++) {
    let ch = Hex[i];
    let digit = parseInt(ch, 16);
    if (isNaN(digit)) {
      throw new Error('Error: not a Hex String');
    }
    res = (res << 4) + digit;
  }
  return res;
}

function DESryStrHex(StrHex, Key) {
  let Str = '';

  // 遍历每两个字符,并转换为字符添加到Str中  
  for (let i = 0; i < StrHex.length; i += 2) {
    let temp = StrHex.substr(i, 2);
    let charCode = HexToInt(temp);
    Str += String.fromCharCode(charCode);
  }

  // 解密字符串  
  return DESryStr(Str, Key);
}
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/6/8 18:01:49
33楼: console.log(DESryStrHex(EncryStrHex('1234567', 'SDFSF324233432432SFDS'), 'SDFSF324233432432SFDS'));

这样输出1234567,好像是能加密和解密。

但是,感觉有点问题。因为我用其他js代码,完全模仿delphi的代码,计算注册码,和EXE产生的不同,分析了一下,就是在DES部分的差异。
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/6/8 18:22:31
34楼: type
  TKeyByte = array[0..5] of Byte;

这个AI回答是
type TKeyByte = [number, number, number, number, number, number];

但是提示错误,只能注释掉。感觉会影响下面的全局变量TKeyByte代码




var
  subKey: array[0..15] of TKeyByte;
AI回答
var subKey = new Uint8Array(16);
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/6/8 19:44:43
35楼: delphi里

EncryStrHex('1535232348ce73fd9cc8591afdd531b5', 'SDFSF324233432432SFDS');
//得到 EACB68DC802055BB519C7F204CB83998A6743806639E4EC9DC6E180D4C3CF450


这个网页上,不知道怎么核对相同的加密方式
https://www.toolhelper.cn/SymmetricEncryption/DES
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/6/9 8:28:51
36楼: var md5s = '1535232348ce73fd9cc8591afdd531b5';
console.log('EncryStrHex: '+ EncryStrHex(md5s, 'SDFSF324233432432SFDS'));
//调用转换成的des.js代码里的函数,返回
//95b9a8f7e75b61c6fa1c1e63aa343d458e073575907da6ffc205767ffc4345b68ca64de9c1b123a7
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2024/6/9 8:32:48
37楼: 因为js是会下载到客户端的,我的软件注册码生成程序是不可能写成js版本的。

只是作为测试和学Xjs试试的。如果真要把EXE的注册码生成程序改成网页版,只能转换为后端语言,比如php,python之类的或者简单一点,采用后端语言调用服务器上的exe,取得返回结果。
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行97.65625毫秒 RSS