All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.hutool.core.codec.Rot Maven / Gradle / Ivy

There is a newer version: 5.8.34
Show newest version
package cn.hutool.core.codec;

import cn.hutool.core.lang.Assert;

/**
 * RotN(rotate by N places),回转N位密码,是一种简易的替换式密码,也是过去在古罗马开发的凯撒加密的一种变体。
* 代码来自:https://github.com/orclight/jencrypt * * @author looly,shuzhilong * @since 4.4.1 */ public class Rot { private static final char aCHAR = 'a'; private static final char zCHAR = 'z'; private static final char ACHAR = 'A'; private static final char ZCHAR = 'Z'; private static final char CHAR0 = '0'; private static final char CHAR9 = '9'; /** * Rot-13编码,同时编码数字 * * @param message 被编码的消息 * @return 编码后的字符串 */ public static String encode13(String message) { return encode13(message, true); } /** * Rot-13编码 * * @param message 被编码的消息 * @param isEncodeNumber 是否编码数字 * @return 编码后的字符串 */ public static String encode13(String message, boolean isEncodeNumber) { return encode(message, 13, isEncodeNumber); } /** * RotN编码 * * @param message 被编码的消息 * @param offset 位移,常用位移13 * @param isEncodeNumber 是否编码数字 * @return 编码后的字符串 */ public static String encode(String message, int offset, boolean isEncodeNumber) { Assert.notNull(message, "message must not be null"); final int len = message.length(); final char[] chars = new char[len]; for (int i = 0; i < len; i++) { chars[i] = encodeChar(message.charAt(i), offset, isEncodeNumber); } return new String(chars); } /** * Rot-13解码,同时解码数字 * * @param rot 被解码的消息密文 * @return 解码后的字符串 */ public static String decode13(String rot) { return decode13(rot, true); } /** * Rot-13解码 * * @param rot 被解码的消息密文 * @param isDecodeNumber 是否解码数字 * @return 解码后的字符串 */ public static String decode13(String rot, boolean isDecodeNumber) { return decode(rot, 13, isDecodeNumber); } /** * RotN解码 * * @param rot 被解码的消息密文 * @param offset 位移,常用位移13 * @param isDecodeNumber 是否解码数字 * @return 解码后的字符串 */ public static String decode(String rot, int offset, boolean isDecodeNumber) { Assert.notNull(rot, "rot must not be null"); final int len = rot.length(); final char[] chars = new char[len]; for (int i = 0; i < len; i++) { chars[i] = decodeChar(rot.charAt(i), offset, isDecodeNumber); } return new String(chars); } // ------------------------------------------------------------------------------------------ Private method start /** * 解码字符 * * @param c 字符 * @param offset 位移 * @param isDecodeNumber 是否解码数字 * @return 解码后的字符串 */ private static char encodeChar(char c, int offset, boolean isDecodeNumber) { if (isDecodeNumber) { if (c >= CHAR0 && c <= CHAR9) { c -= CHAR0; c = (char) ((c + offset) % 10); c += CHAR0; } } // A == 65, Z == 90 if (c >= ACHAR && c <= ZCHAR) { c -= ACHAR; c = (char) ((c + offset) % 26); c += ACHAR; } // a == 97, z == 122. else if (c >= aCHAR && c <= zCHAR) { c -= aCHAR; c = (char) ((c + offset) % 26); c += aCHAR; } return c; } /** * 编码字符 * * @param c 字符 * @param offset 位移 * @param isDecodeNumber 是否编码数字 * @return 编码后的字符串 */ private static char decodeChar(char c, int offset, boolean isDecodeNumber) { int temp = c; // if converting numbers is enabled if (isDecodeNumber) { if (temp >= CHAR0 && temp <= CHAR9) { temp -= CHAR0; temp = temp - offset; while (temp < 0) { temp += 10; } temp += CHAR0; } } // A == 65, Z == 90 if (temp >= ACHAR && temp <= ZCHAR) { temp -= ACHAR; temp = temp - offset; while (temp < 0) { temp = 26 + temp; } temp += ACHAR; } else if (temp >= aCHAR && temp <= zCHAR) { temp -= aCHAR; temp = temp - offset; if (temp < 0) temp = 26 + temp; temp += aCHAR; } return (char) temp; } // ------------------------------------------------------------------------------------------ Private method end }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy