鱼C论坛

 找回密码
 立即注册
查看: 1782|回复: 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一下就行了
# -*- encoding:utf-8 -*-

from functools import cmp_to_key,partial
from uuid import uuid3,NAMESPACE_DNS


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

arr = '你们好吗'
arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字1')))
print(''.join(arr2)) #好吗们你
arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字2')))
print(''.join(arr2)) #吗好你们
arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字1')))
print(''.join(arr2)) #好吗们你

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2022-2-5 07:31:37 From FishC Mobile | 显示全部楼层
设计一个加密算法或者使用已经存在的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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


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

print(result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-2-5 09:20:42 | 显示全部楼层
这不是随机,是用某种固定规则改变 str1 排列循序而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

from functools import cmp_to_key,partial
from uuid import uuid3,NAMESPACE_DNS


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

arr = [1,2,3,4,5,6,0]
arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字1')))
print(arr2)
arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字2')))
print(arr2)
arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字1')))
print(arr2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-2-5 17:47:14 | 显示全部楼层
学以致用啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

woc  给大佬跪了,,,,完全看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我好像懂了又好像没懂(捂脸哭)    大佬能举个例子么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这就是你需要的啊  arr是原字符串  用的是sorted这个函数来排序的  排序后会变成数组你再join一下就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

from functools import cmp_to_key,partial
from uuid import uuid3,NAMESPACE_DNS


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

arr = '你们好吗'
arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字1')))
print(''.join(arr2)) #好吗们你
arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字2')))
print(''.join(arr2)) #吗好你们
arr2 = sorted(arr,key=cmp_to_key(partial(rule,keyword='关键字1')))
print(''.join(arr2)) #好吗们你

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

if __name__ == "__main__":
    print("HelloWorld", ":", get_key("HelloWorld")) #HelloWorld : 726C-ZWXS-56C6-29YB
    print("ILoveFishC", ":", get_key("ILoveFishC")) #ILoveFishC : 7368-TG92-C6F7-MLZA
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

这是加密,就是说密文和原始串看不出任何关联
至于你说的乱序没啥意义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我好像明白了,,,,感谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

虽然但是……乱序是要实现的目的呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢大佬帮助,,,虽然输出内容依然不是原字符串的乱序啊(捂脸哭)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 13:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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