字符串简单加密

我自己写的一个方法,能够对字符串进行简单加密,能够保证:

1.输入值相同时,输出值相同;
2.输入值不同时,输出值不一定不相同。

上代码

/**
     * 简单加密字符串<br>
     * 生成字符串长度为5到14位,内容为Unicode编码的33到127位(不包括)的字符<br>
     * 即:“!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~”
     * @param pwd 原始密码
     * @return 加密后的密码
     */
    public static String getPwd(String pwd){
        char[] pwdChars = pwd.toCharArray();    //原始密码转换成字符数组
        int num = 0;        //各字符的编码值除以数组长度的余数求和
        for (int i = 0; i < pwdChars.length; i++) {
            num = num + pwdChars[i] % pwdChars.length;
        }

        int len = num % 10 + 5;         //新密码长度
        char[] newChars = new char[len];
        Random random = new Random(num);

        for (int i = 0; i < len; i++) {
            newChars[i] = (char) (random.nextInt(94) + 33);
        }

        return new String(newChars);
    }

这是一个静态方法,能够对传入的字符串进行一个转换,生成一个长度在5位到14位之间的字符串,字符串中的每个字符的Unicode编码都在33到127位(不包括)之间。我测试过第32位是空格,第31和127位都无法在控制台上正确显示。

下面讲讲怎么实现的。

首先将传入的字符串转化为字符数组,然后定义一个变量num,其值为字符数组中各字符的编码值除以数组长度的余数的和。

之后通过 num % 10 + 5 生成新字符串的长度len。num % 5 ,不管num这个值有多大,其结果都在0到9之间,再加上5,保证生成的值在5到14之间。

定义一个新的字符数组,长度为len,用于存储最终字符串的各个字符。

将len作为种子传入获取随机数生成器对象,保证多次运行生成的随机数列相同。

然后利用nextInt(94)方法生成0到94(不包括)之间的整随机数,再加上33,保证生成的整数再33到127(不包括)之间,再将这个整数转化为字符并存入之前定义的字符数组中。

最后将字符数组转化为字符串返回。

方法中使用取模运算是为了保证输入值相同时输出值相同,但不能通过输出值反推输入值。举个例子:92 % 10 = 2,但是 x % 10 = 2时,x并不一定等于92,还可能等于82,72。这是我从一个讲比特币的博客中看到的,虽然那篇博客我没看懂,但这个取模运算我记住了。

如果文章中哪里写错了,欢迎指正!

发布了5 篇原创文章 · 获赞 2 · 访问量 90

猜你喜欢

转载自blog.csdn.net/weixin_44848760/article/details/104218761