鱼C论坛

 找回密码
 立即注册
查看: 2070|回复: 18

[已解决]如何可控地打乱字符串(没头绪了)

[复制链接]
发表于 2022-2-5 00:21:18 | 显示全部楼层 |阅读模式

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

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

x
求助求助


假设我有一个字符串str1

我想要在给程序输入一段关键词后  随机生成一段打乱的str1(记做str2)

需要让每次输入同样的关键词生成的str2相同,而输入不同的关键词得到不同的str2

这应该怎么做,感觉已经毫无头绪了

还是说涉及到密码学的知识了
最佳答案
2022-2-6 01:05:31
kogawananari 发表于 2022-2-6 01:03
这就是你需要的啊  arr是原字符串  用的是sorted这个函数来排序的  排序后会变成数组你再join一下就行了
  1. # -*- encoding:utf-8 -*-

  2. from functools import cmp_to_key,partial
  3. from uuid import uuid3,NAMESPACE_DNS


  4. def rule(a,b,keyword):
  5.     _uuid = uuid3(NAMESPACE_DNS,f'{a}{b}{keyword}')
  6.     if f'{_uuid}' > '88888888-8888-8888-8888-888888888888':
  7.         return -1
  8.     return 1

  9. arr = '你们好吗'
  10. arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字1')))
  11. print(''.join(arr2)) #好吗们你
  12. arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字2')))
  13. print(''.join(arr2)) #吗好你们
  14. arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字1')))
  15. print(''.join(arr2)) #好吗们你

复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-2-5 05:37:35 From FishC Mobile | 显示全部楼层
这不就是注册机么,不过注册机就不是随机生成,而是按照某种规则生成。如果是随机生成的规则,那么就不可能每次输入相同都能得到输出相同。如果是想要个注册机只需要自己设定一个输出规则就好了,很简单。比如输入x = 123456,输出规则为147258369 *x%8888+1000,你就可以得到一个四位数的密钥,而这个加密规则只有你自己知道,每次输入不同的x得出不同的密钥,这就是注册机。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-5 05:40:41 From FishC Mobile | 显示全部楼层
同理对字符串一样适用,你可以用base64加密一段字符串,然后截取加密后的字符串某一片段作为输出密钥,也可以更复杂用各种进制,都可以。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-5 07:31:37 From FishC Mobile | 显示全部楼层
设计一个加密算法或者使用已经存在的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-5 09:01:47 | 显示全部楼层
本帖最后由 isdkz 于 2022-2-5 09:06 编辑

像这种可以通过哈希算法加盐值实现,
不过不是随机生成,
随机生成的话怎么能让一样的关键词得到的结果一样

  1. import hashlib


  2. # 盐值
  3. salt = input("请输入关键词:")
  4. # 要加密的字符串
  5. string = input("请输入你的字符串:")
  6. # 生成md5对象,并加盐
  7. md5 = hashlib.md5(salt.encode())
  8. # 加密字符串
  9. md5.update(string.encode())
  10. # 获取密文
  11. result = md5.hexdigest()

  12. print(result)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-2-5 09:20:42 | 显示全部楼层
这不是随机,是用某种固定规则改变 str1 排列循序而已
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-5 12:54:01 | 显示全部楼层
打乱的话可以用排列组合算法,c++有内置的,python不大清楚
参考:https://blog.csdn.net/c18219227162/article/details/50301513
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-5 14:31:00 | 显示全部楼层
  1. # -*- encoding:utf-8 -*-

  2. from functools import cmp_to_key,partial
  3. from uuid import uuid3,NAMESPACE_DNS


  4. def rule(a,b,keyword):
  5.     _uuid = uuid3(NAMESPACE_DNS,f'{a}{b}{keyword}')
  6.     if f'{_uuid}' > '88888888-8888-8888-8888-888888888888':
  7.         return -1
  8.     return 1

  9. arr = [1,2,3,4,5,6,0]
  10. arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字1')))
  11. print(arr2)
  12. arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字2')))
  13. print(arr2)
  14. arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字1')))
  15. print(arr2)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-2-5 17:47:14 | 显示全部楼层
学以致用啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-6 00:38:39 | 显示全部楼层
isdkz 发表于 2022-2-5 09:01
像这种可以通过哈希算法加盐值实现,
不过不是随机生成,
随机生成的话怎么能让一样的关键词得到的结果一 ...

麻烦问一下   我按照你的代码大体套了下我的程序   发现运行后输出的字符串和之前输入的完全不一样(之前输入的是英文字母,输出的是一大长串诸如
  1. e7f0091c12ac7436212046ba9b2d5c87
复制代码
的东西,,,,这是什么情况  还是说需要进一步转码才能得到打乱后的原字符串)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-6 00:41:32 | 显示全部楼层

woc  给大佬跪了,,,,完全看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-6 00:44:28 | 显示全部楼层
qq1151985918 发表于 2022-2-5 05:40
同理对字符串一样适用,你可以用base64加密一段字符串,然后截取加密后的字符串某一片段作为输出密钥,也可 ...

我好像懂了又好像没懂(捂脸哭)    大佬能举个例子么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-6 01:03:15 | 显示全部楼层
二酱零醚 发表于 2022-2-6 00:41
woc  给大佬跪了,,,,完全看不懂

这就是你需要的啊  arr是原字符串  用的是sorted这个函数来排序的  排序后会变成数组你再join一下就行了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-6 01:05:31 | 显示全部楼层    本楼为最佳答案   
kogawananari 发表于 2022-2-6 01:03
这就是你需要的啊  arr是原字符串  用的是sorted这个函数来排序的  排序后会变成数组你再join一下就行了
  1. # -*- encoding:utf-8 -*-

  2. from functools import cmp_to_key,partial
  3. from uuid import uuid3,NAMESPACE_DNS


  4. def rule(a,b,keyword):
  5.     _uuid = uuid3(NAMESPACE_DNS,f'{a}{b}{keyword}')
  6.     if f'{_uuid}' > '88888888-8888-8888-8888-888888888888':
  7.         return -1
  8.     return 1

  9. arr = '你们好吗'
  10. arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字1')))
  11. print(''.join(arr2)) #好吗们你
  12. arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字2')))
  13. print(''.join(arr2)) #吗好你们
  14. arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字1')))
  15. print(''.join(arr2)) #好吗们你

复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-6 02:04:10 | 显示全部楼层
二酱零醚 发表于 2022-2-6 00:44
我好像懂了又好像没懂(捂脸哭)    大佬能举个例子么

给你简单举个例子
假设你是想要一个注册机做的
慢慢看一下就懂了
  1. import base64

  2. def get_key(string):
  3.     data = string[1:] + "ZXCVB-1472580369-QWERT" +string[:-1]
  4.     s = data.encode()
  5.    
  6.     key01 = s.hex()[-4:]
  7.     key02 = base64.b64encode(s).decode()[:4]
  8.     key03 = s.hex()[1:5]
  9.     key04 = base64.b64encode(s).decode()[-7:-3]
  10.    
  11.     key = "-".join([key01, key02, key03, key04]).upper()
  12.     return key

  13. if __name__ == "__main__":
  14.     print("HelloWorld", ":", get_key("HelloWorld")) #HelloWorld : 726C-ZWXS-56C6-29YB
  15.     print("ILoveFishC", ":", get_key("ILoveFishC")) #ILoveFishC : 7368-TG92-C6F7-MLZA
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-2-6 09:52:44 From FishC Mobile | 显示全部楼层
二酱零醚 发表于 2022-2-6 00:38
麻烦问一下   我按照你的代码大体套了下我的程序   发现运行后输出的字符串和之前输入的完全不一样(之前 ...

这是加密,就是说密文和原始串看不出任何关联
至于你说的乱序没啥意义
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-6 19:47:19 | 显示全部楼层

我好像明白了,,,,感谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-6 19:47:51 | 显示全部楼层
wp231957 发表于 2022-2-6 09:52
这是加密,就是说密文和原始串看不出任何关联
至于你说的乱序没啥意义

虽然但是……乱序是要实现的目的呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-6 19:49:39 | 显示全部楼层
qq1151985918 发表于 2022-2-6 02:04
给你简单举个例子
假设你是想要一个注册机做的
慢慢看一下就懂了

感谢大佬帮助,,,虽然输出内容依然不是原字符串的乱序啊(捂脸哭)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 10:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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