都知道博文里面出现真实姓名不合适……但是大部分地方,我也不喜欢用缩写或者用英文名。于是就有了这个生成乱码的工具。

甚至大部分时候我都不知道怎么提及自己……(自己的世界除外,彼处不需要解释)

基本原理

基础知识

汉字 Unicode 范围为 4E00-9FA5,对应下文用到的十进制数 19968-40869。

加密原理

有介于我几乎不懂任何密码学的知识,我暂且选择了一个传说中不可逆的加密算法 md5。

转化为十进制数,然后模范围长度的字数次方……中文名按照姓名分别加密……原理目前就这么简单。

import hashlib, warnings

def zh_name(name: str) -> str:
    minbound, maxbound = 19968, 40869
    ans = ""

    a = hashlib.md5(name.encode("utf-8"))
    value = int(a.hexdigest(), 36)

    for i in range(len(name)):
        tmpa = value % (maxbound - minbound)
        ans += chr(tmpa + minbound)
        value //= (maxbound - minbound)
    return ans

def en_name(name: str) -> str:
    ans = ""

    a = hashlib.md5(name.encode("utf-8"))
    value = int(a.hexdigest(), 36)

    for i in range(len(name)):
        tmpa = value % 26
        ans += chr(tmpa + 97)
        value //= 26
    return ans.capitalize() # 有效位数达 30+,对于一般的英文名绰绰有余

def name(first: str, last: str, lang: str) -> str:
    '按照对应自然语言顺序读取,lang 有效值为 zh 和 en'
    if lang == "en":
        return f"{en_name(first)} {en_name(last)}"
    elif lang == "zh":
        return f"{zh_name(first)}{zh_name(last)}"
    else:
        warnings.warn(f"不支持的语言:{lang}")
        return first + ' ' + last
>>> name("袁", "隆平", "zh")
'鬁愘圖'
>>> name("Harry", "Potter", "en")
'Eovio Stoipx'

悬赏

有介于姓名还算是非常重要的个人信息……所以如果有人发现当前的加密方法可以被轻易攻破,攻破下面的示例,并及时告知我,我将不胜感激。(社会工程学攻击除外)

而如果提供了更好的加密方法……则有酬金,算法为从启用之日起,到攻破之日中,每日五分,细节协商。

祭出一个不知名的 7 班同学之名:虚煎薼

3 对 “随机化姓名生成器”的想法;

发表评论

电子邮件地址不会被公开。 必填项已用*标注