二酱零醚 发表于 2022-2-5 00:21:18

如何可控地打乱字符串(没头绪了)

求助求助


假设我有一个字符串str1

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

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

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

还是说涉及到密码学的知识了

qq1151985918 发表于 2022-2-5 05:37:35

这不就是注册机么,不过注册机就不是随机生成,而是按照某种规则生成。如果是随机生成的规则,那么就不可能每次输入相同都能得到输出相同。如果是想要个注册机只需要自己设定一个输出规则就好了,很简单。比如输入x = 123456,输出规则为147258369 *x%8888+1000,你就可以得到一个四位数的密钥,而这个加密规则只有你自己知道,每次输入不同的x得出不同的密钥,这就是注册机。

qq1151985918 发表于 2022-2-5 05:40:41

同理对字符串一样适用,你可以用base64加密一段字符串,然后截取加密后的字符串某一片段作为输出密钥,也可以更复杂用各种进制,都可以。

wp231957 发表于 2022-2-5 07:31:37

设计一个加密算法或者使用已经存在的

isdkz 发表于 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)

傻眼貓咪 发表于 2022-2-5 09:20:42

这不是随机,是用某种固定规则改变 str1 排列循序而已

lhgzbxhz 发表于 2022-2-5 12:54:01

打乱的话可以用排列组合算法,c++有内置的,python不大清楚
参考:https://blog.csdn.net/c18219227162/article/details/50301513

kogawananari 发表于 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 =
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)

隔壁老程呀 发表于 2022-2-5 17:47:14

学以致用啊{:5_108:}

二酱零醚 发表于 2022-2-6 00:38:39

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

麻烦问一下   我按照你的代码大体套了下我的程序   发现运行后输出的字符串和之前输入的完全不一样(之前输入的是英文字母,输出的是一大长串诸如e7f0091c12ac7436212046ba9b2d5c87的东西,,,,这是什么情况还是说需要进一步转码才能得到打乱后的原字符串)

二酱零醚 发表于 2022-2-6 00:41:32

kogawananari 发表于 2022-2-5 14:31


woc给大佬跪了,,,,完全看不懂

二酱零醚 发表于 2022-2-6 00:44:28

qq1151985918 发表于 2022-2-5 05:40
同理对字符串一样适用,你可以用base64加密一段字符串,然后截取加密后的字符串某一片段作为输出密钥,也可 ...

我好像懂了又好像没懂(捂脸哭)    大佬能举个例子么

kogawananari 发表于 2022-2-6 01:03:15

二酱零醚 发表于 2022-2-6 00:41
woc给大佬跪了,,,,完全看不懂

这就是你需要的啊arr是原字符串用的是sorted这个函数来排序的排序后会变成数组你再join一下就行了

kogawananari 发表于 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)) #好吗们你



qq1151985918 发表于 2022-2-6 02:04:10

二酱零醚 发表于 2022-2-6 00:44
我好像懂了又好像没懂(捂脸哭)    大佬能举个例子么

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

def get_key(string):
    data = string + "ZXCVB-1472580369-QWERT" +string[:-1]
    s = data.encode()
   
    key01 = s.hex()[-4:]
    key02 = base64.b64encode(s).decode()[:4]
    key03 = s.hex()
    key04 = base64.b64encode(s).decode()[-7:-3]
   
    key = "-".join().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

wp231957 发表于 2022-2-6 09:52:44

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

这是加密,就是说密文和原始串看不出任何关联
至于你说的乱序没啥意义

二酱零醚 发表于 2022-2-6 19:47:19

kogawananari 发表于 2022-2-6 01:05


我好像明白了,,,,感谢大佬

二酱零醚 发表于 2022-2-6 19:47:51

wp231957 发表于 2022-2-6 09:52
这是加密,就是说密文和原始串看不出任何关联
至于你说的乱序没啥意义

虽然但是……乱序是要实现的目的呀

二酱零醚 发表于 2022-2-6 19:49:39

qq1151985918 发表于 2022-2-6 02:04
给你简单举个例子
假设你是想要一个注册机做的
慢慢看一下就懂了

感谢大佬帮助,,,虽然输出内容依然不是原字符串的乱序啊(捂脸哭)
页: [1]
查看完整版本: 如何可控地打乱字符串(没头绪了)