如何可控地打乱字符串(没头绪了)
求助求助假设我有一个字符串str1
我想要在给程序输入一段关键词后随机生成一段打乱的str1(记做str2)
需要让每次输入同样的关键词生成的str2相同,而输入不同的关键词得到不同的str2
这应该怎么做,感觉已经毫无头绪了
还是说涉及到密码学的知识了 这不就是注册机么,不过注册机就不是随机生成,而是按照某种规则生成。如果是随机生成的规则,那么就不可能每次输入相同都能得到输出相同。如果是想要个注册机只需要自己设定一个输出规则就好了,很简单。比如输入x = 123456,输出规则为147258369 *x%8888+1000,你就可以得到一个四位数的密钥,而这个加密规则只有你自己知道,每次输入不同的x得出不同的密钥,这就是注册机。 同理对字符串一样适用,你可以用base64加密一段字符串,然后截取加密后的字符串某一片段作为输出密钥,也可以更复杂用各种进制,都可以。 设计一个加密算法或者使用已经存在的 本帖最后由 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) 这不是随机,是用某种固定规则改变 str1 排列循序而已 打乱的话可以用排列组合算法,c++有内置的,python不大清楚
参考:https://blog.csdn.net/c18219227162/article/details/50301513 # -*- 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) 学以致用啊{:5_108:} isdkz 发表于 2022-2-5 09:01
像这种可以通过哈希算法加盐值实现,
不过不是随机生成,
随机生成的话怎么能让一样的关键词得到的结果一 ...
麻烦问一下 我按照你的代码大体套了下我的程序 发现运行后输出的字符串和之前输入的完全不一样(之前输入的是英文字母,输出的是一大长串诸如e7f0091c12ac7436212046ba9b2d5c87的东西,,,,这是什么情况还是说需要进一步转码才能得到打乱后的原字符串) kogawananari 发表于 2022-2-5 14:31
woc给大佬跪了,,,,完全看不懂 qq1151985918 发表于 2022-2-5 05:40
同理对字符串一样适用,你可以用base64加密一段字符串,然后截取加密后的字符串某一片段作为输出密钥,也可 ...
我好像懂了又好像没懂(捂脸哭) 大佬能举个例子么 二酱零醚 发表于 2022-2-6 00:41
woc给大佬跪了,,,,完全看不懂
这就是你需要的啊arr是原字符串用的是sorted这个函数来排序的排序后会变成数组你再join一下就行了 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)) #好吗们你
二酱零醚 发表于 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
二酱零醚 发表于 2022-2-6 00:38
麻烦问一下 我按照你的代码大体套了下我的程序 发现运行后输出的字符串和之前输入的完全不一样(之前 ...
这是加密,就是说密文和原始串看不出任何关联
至于你说的乱序没啥意义 kogawananari 发表于 2022-2-6 01:05
我好像明白了,,,,感谢大佬 wp231957 发表于 2022-2-6 09:52
这是加密,就是说密文和原始串看不出任何关联
至于你说的乱序没啥意义
虽然但是……乱序是要实现的目的呀 qq1151985918 发表于 2022-2-6 02:04
给你简单举个例子
假设你是想要一个注册机做的
慢慢看一下就懂了
感谢大佬帮助,,,虽然输出内容依然不是原字符串的乱序啊(捂脸哭)
页:
[1]