自定义加密算法的实现
由于要传一个需要保密的ID,因此用到对称加密,但mcrypt_encrypt算法加密后字符串太长,因此想实现一个自定义加密算法,想法如下
首先先对key计算sha1,取结果的前32bit,然后跟要加密整数进行异或,得到一个加密后的32bit结果
对结果分组:2bit | 6bit | 6bit | 6bit | 6bit | 6bit
各个组分别取名为:a0、a1、a2、a3、a4、a5
另定义一个长度64的字典数组
$dict=array('1','2','3','4','5','6','7','8','9',
'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',
'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',
'01','02','03');
将前面每个分组的值作为字典数组的下标,则加密结果为:$dict[a0].$dict[a1].$dict[a2].$dict[a3].$dict[a4].$dict[a5]
这样加密后的结果就是一个长度6-12的字符串,如果字典数组最后3个元素用其他单字符表示,那么结果就固定为6个字符的字符串。
由于初学php不久,对php的函数库不熟悉,求大侠帮忙实现下加密解密算法:
string encrypt(int id,string key)
int decrypt(string text,string key)
回复讨论(解决方案)
echo encrypt(1234, 'abc'), PHP_EOL;echo decrypt( '1TgGSY', 'abc');function encrypt($id, $key) { $dict = array('1','2','3','4','5','6','7','8','9', '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', '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', '-','=','*' ); $key = current(unpack('L', sha1($key, 1))); $id ^= $key; $t = str_split(sprintf('%036b', $id), 6); foreach($t as &$v) $v = $dict[bindec($v)]; return join($t);}function decrypt($s, $key) { $dict = array('1','2','3','4','5','6','7','8','9', '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', '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', '-','=','*' ); $dict = array_flip($dict); foreach(str_split($s) as $c) $r[] = sprintf('%06b', $dict[$c]); $id = bindec(join($r)); $key = current(unpack('L', sha1($key, 1))); return $id ^ $key;}
1234
我自己也实现了加密过程,不过看起来就没那么优雅了,执行效率也低点,贴出来衬托下高手风范
$key_string = 'abc';function keyToInt($key) { $key_sha1 = sha1 ( $key ); $first_char = $key_sha1 [0]; if (ord ( $first_char ) > 55) { return hexdec ( (hexdec ( $first_char ) & 7) . substr ( $key_sha1, 1, 7 ) ) | (- 2147483648); } else { return hexdec ( $key_sha1 ); }}function Encrypt($num){ $dict = array('0','1','2','3','4','5','6','7','8','9','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','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','*','!'); $r1 = $num ^ keyToInt ( $key_string ); $r2 = decbin ( $r1 ); $r3 = array ( bindec ( substr ( $r2, 0, 2 ) ), bindec ( substr ( $r2, 2, 6 ) ), bindec ( substr ( $r2, 8, 6 ) ), bindec ( substr ( $r2, 14, 6 ) ), bindec ( substr ( $r2, 20, 6 ) ), bindec ( substr ( $r2, 26, 6 ) ) ); return $dict [$r3 [0]] . $dict [$r3 [1]] . $dict [$r3 [2]] . $dict [$r3 [3]] . $dict [$r3 [4]] . $dict [$r3 [5]];}
算法实现之后,发觉在设计算法时,有个缺陷没考虑到,
由于仅仅是id与key异或,加密后的结果存在一定规律性,
比如
1234->1TgGSY
1235->1TgGSX
有没有什么好的办法打散下结果?
这个够乱的了吧
$id = 1234;$key = 'aaa';for($i=1; $i<100; $i++) { printf("%-10d %s %s\n", $id, $s = encrypt($id++, $key), decrypt( $s, $key));}function encrypt($id, $key) { $dict = array('1','2','3','4','5','6','7','8','9', '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', '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', '-','=','*' ); $n = rand(0, 15); srand($n); $key = current(unpack('L', substr(sha1($key, 1), $n))); $id ^= $key; $t = str_split(sprintf('%04b%032b', $n, $id), 6); foreach($t as $i=>&$v) { $v = $dict[bindec($v)]; if($i == 0) shuffle($dict); } return join($t);}function decrypt($s, $key) { $dict = array('1','2','3','4','5','6','7','8','9', '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', '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', '-','=','*' ); $m = array_search($s{0}, $dict); $n = $m >> 2; srand($n); shuffle($dict); $dict = array_flip($dict); foreach(str_split($s) as $i=>$c) { $r[] = sprintf('%06b', $i==0 ? $m&0x03 : $dict[$c]); } $id = bindec(join($r)); $key = current(unpack('L', substr(sha1($key, 1), $n))); return $id ^ $key;}
1234 4rHK4B 12341235 oD2LN* 12351236 wqkf8u 12361237 6k=GVU 12371238 bxeCr* 12381239 =W-AOi 12391240 IiQ3e1 12401241 z6uMMA 12411242 WLcnd8 12421243 Rizj*M 12431244 4rHK47 12441245 oD2LNT 12451246 wqkf8Z 12461247 6k=GVJ 12471248 bxeCrE 12481249 =W-AOP 12491250 IiQ3et 12501251 z6uMMP 12511252 WLcndU 12521253 Rizj*p 12531254 4rHK4s 12541255 oD2LNs 12551256 wqkf84 12561257 6k=GVn 12571258 bxeCrL 12581259 =W-AOT 12591260 IiQ3ex 12601261 z6uMM1 12611262 WLcndD 12621263 Rizj*s 12631264 4rHK4h 12641265 oD2LNq 12651266 wqkf83 12661267 6k=GVg 12671268 bxeCr5 12681269 =W-AOH 12691270 IiQ3eP 12701271 z6uMMc 12711272 WLcndE 12721273 Rizj*6 12731274 4rHK4I 12741275 oD2LN= 12751276 wqkf8U 12761277 6k=GVI 12771278 bxeCr9 12781279 =W-AOl 12791280 IiQ3bI 12801281 z6uMhG 12811282 WLcnaY 12821283 Rizj6d 12831284 4rHK3Z 12841285 oD2L*n 12851286 wqkfbP 12861287 6k=Gzj 12871288 bxeC=o 12881289 =W-AEd 12891290 IiQ3bY 12901291 z6uMh* 12911292 WLcnag 12921293 Rizj6v 12931294 4rHK3F 12941295 oD2L*e 12951296 wqkfbJ 12961297 6k=Gzm 12971298 bxeC=N 12981299 =W-AEw 12991300 IiQ3bs 13001301 z6uMhl 13011302 WLcna4 13021303 Rizj6V 13031304 4rHK3u 13041305 oD2L*V 13051306 wqkfbm 13061307 6k=Gz* 13071308 bxeC=- 13081309 =W-AEa 13091310 IiQ3bm 13101311 z6uMhe 13111312 WLcnaS 13121313 Rizj6= 13131314 4rHK38 13141315 oD2L*l 13151316 wqkfbS 13161317 6k=Gz6 13171318 bxeC=q 13181319 =W-AEn 13191320 IiQ3bO 13201321 z6uMhV 13211322 WLcnau 13221323 Rizj61 13231324 4rHK3K 13241325 oD2L*p 13251326 wqkfbv 13261327 6k=Gzw 13271328 bxeC=h 13281329 =W-AE- 13291330 IiQ3bS 13301331 z6uMhj 13311332 WLcna9 1332
在你的设计中,第一节只有 2bit 有效位,所以可在其上再附加4bit信息
而0~15的随机数正好是4bit
算法中,这个随机数起到2个作用
1、调整 key
2、打乱字典
如果不怎么需要太强的保密性,位运算移位就足够了,省点CPU
楼主的解答超赞
加上随机数后,1个整数可对应16种结果,64^6种结果尽数用上,解密时也不用再判断是不是无效字符串了。
是楼主的解答超赞,打错啦
不打了

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Netflix上的头像是你流媒体身份的可视化代表。用户可以超越默认的头像来展示自己的个性。继续阅读这篇文章,了解如何在Netflix应用程序中设置自定义个人资料图片。如何在Netflix中快速设置自定义头像在Netflix中,没有内置功能来设置个人资料图片。不过,您可以通过在浏览器上安装Netflix扩展来实现此目的。首先,在浏览器上安装Netflix扩展的自定义个人资料图片。你可以在Chrome商店买到它。安装扩展后,在浏览器上打开Netflix并登录您的帐户。导航至右上角的个人资料,然后单击

Win11如何自定义背景图片?在最新发布的win11系统中,里面有许多的自定义功能,但是很多小伙伴不知道应该如何使用这些功能。就有小伙伴觉得背景图片比较单调,想要自定义背景图,但是不知道如何操作自定义背景图,如果你不知道如何定义背景图片,小编下面整理了Win11自定义背景图片步骤,感兴趣的话一起往下看看把!Win11自定义背景图片步骤1、点击桌面win按钮,在弹出的菜单中点击设置,如图所示。2、进入设置菜单,点击个性化,如图所示。3、进入个性化,点击背景,如图所示。4、进入背景设置,点击浏览图片

维恩图是用来表示集合之间关系的图。要创建维恩图,我们将使用matplotlib。Matplotlib是一个在Python中常用的数据可视化库,用于创建交互式的图表和图形。它也用于制作交互式的图像和图表。Matplotlib提供了许多函数来自定义图表和图形。在本教程中,我们将举例说明三个示例来自定义Venn图。Example的中文翻译为:示例这是一个创建两个维恩图交集的简单示例;首先,我们导入了必要的库并导入了venns。然后我们将数据集创建为Python集,之后,我们使用“venn2()”函数创

CakePHP是一个强大的PHP框架,为开发人员提供了很多有用的工具和功能。其中之一是分页,它可以帮助我们将大量数据分成几页,从而简化浏览和操作。默认情况下,CakePHP提供了一些基本的分页方法,但有时你可能需要创建一些自定义的分页方法。这篇文章将向您展示如何在CakePHP中创建自定义分页。步骤1:创建自定义分页类首先,我们需要创建一个自定义分页类。这个

适用于iPhone的iOS17更新为AppleMusic带来了一些重大变化。这包括在播放列表中与其他用户协作,在使用CarPlay时从不同设备启动音乐播放等。这些新功能之一是能够在AppleMusic中使用交叉淡入淡出。这将允许您在曲目之间无缝过渡,这在收听多个曲目时是一个很棒的功能。交叉淡入淡出有助于改善整体聆听体验,确保您在音轨更改时不会受到惊吓或退出体验。因此,如果您想充分利用这项新功能,以下是在iPhone上使用它的方法。如何為AppleMusic啟用和自定Crossfade您需要最新的

如何在Eclipse中自定义快捷键设置?作为一名开发人员,在使用Eclipse进行编码时,熟练掌握快捷键是提高效率的关键之一。Eclipse作为一款强大的集成开发环境,不仅提供了许多默认的快捷键,还允许用户根据自己的偏好进行个性化的定制。本文将介绍如何在Eclipse中自定义快捷键设置,并给出具体的代码示例。打开Eclipse首先,打开Eclipse,并进入

Vue是一款流行的JavaScript框架,它提供了许多方便的功能和API以帮助开发者构建交互式的前端应用程序。随着Vue3的发布,render函数成为了一个重要的更新。本文将介绍Vue3中render函数的概念、用途和如何使用它自定义渲染函数。什么是render函数在Vue中,template是最常用的渲染方式,但是在Vue3中,可以使用另外一种方式:r

如何在CodeIgniter中实现自定义中间件引言:在现代的Web开发中,中间件在应用程序中起着至关重要的作用。它们可以用来执行在请求到达控制器之前或之后执行一些共享的处理逻辑。CodeIgniter作为一个流行的PHP框架,也支持中间件的使用。本文将介绍如何在CodeIgniter中实现自定义中间件,并提供一个简单的代码示例。中间件概述:中间件是一种在请求
