如何用另一个密钥加密字符串?

How to encrypt a string with another key?

我有一个字符串,我想加密以通过不安全的通道发送它。

我想:

转换为整数 my-val & my-private-key。然后,将两者相乘。发送。接收时除以my-private-key转换为int得到my-val.

我尝试按照 here 的建议使用 Integer.parseIntInteger.toString。它似乎适用于 System.out.println(Integer.parseInt("Kona", 27));(如 Java 的文档所述)

所以我做了这个:

int base = 27;
String key = "some key";
String cmd = "some val";
int based = Integer.parseInt(cmd, base);
System.out.println("Based: " + based);
int crypted = based * Integer.parseInt(key, base);
System.out.println("Crypted: " + crypted);
// here use un-secure channel to send/receive
int received = crypted;
int back = received / Integer.parseInt(key, base);
System.out.println("Get back: " + back);
System.out.println("Final result: " + Integer.toString(back, base));

但是我在第 4 行得到 Exception in thread "main" java.lang.NumberFormatException: For input string: "some val"

我尝试使用基数 10、16、27、32。即使我理解为什么 10 和 16 不起作用,为什么 27 和 32 不起作用?我该如何解决?

基于以下维基百科 link 的数字系统,Java 将根据基数参数的范围检查输入字符串的每个字符,如果不在范围内,则会抛出异常。

访问https://en.wikipedia.org/wiki/List_of_numeral_systems,

除此之外,以下是geeksforgeek网站的解释。

  • 字符串为空或 zero-length
  • 字符串表示的值不是int类型的值
  • 特别针对函数的 parseInt(String s, int radix) 变体:
    • 第二个参数基数小于Character.MIN_RADIX或大于Character.MAX_RADIX *

Each character of input string has min and max radix parameter.

  • 字符串的任何字符都不是指定基数的数字,除了第一个字符可能是减号'-'('\u002D')或加号'+'('\u002B')前提是字符串长于长度 1

自定义转换逻辑

String name = "some val";
long key = 0;
for (int i = 0;i<name.length();i++)
    key+= (name.charAt(i) - 'a'+1 ) * Math.pow(26,name.length() - i - 1 );
System.out.println(key);

以上代码取自

我想用另一个字符串加密。我想到将两者相乘,然后将它们转换为 int。但是,它似乎有操作丢失的信息。

所以,我搜索了另一种方法,找到了这个:

private static final String ALGORITHM = "AES";
private static final Key MY_KEY = new SecretKeySpec("16-char priv key".getBytes(), ALGORITHM);

private Cipher getCipher(int mode) throws Exception {
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(mode, MY_KEY);
    return c;
}

public String encrypt(String valueToEnc) throws Exception {
    return Base64.getEncoder().encodeToString(getCipher(Cipher.ENCRYPT_MODE).doFinal(valueToEnc.getBytes()));
}

public String decrypt(String encryptedValue) throws Exception {
    return new String(getCipher(Cipher.DECRYPT_MODE).doFinal(Base64.getDecoder().decode(encryptedValue)));
}

它是如何工作的?它使用密钥加密和解密。这个密钥应该是一个 16 个字符的密钥。另外,为了更容易 show/send/receive,它被转换为 base 64。

使用示例:

String myVal = "some val";
String encrypt = encrypt(myVal);
System.out.println("Encrypt: " + encrypt);
String decrypt = decrypt(encrypt);
System.out.println("Decrypt: " + decrypt);

输出:

Encrypt: ERJZ7ZOJcNpQEAvrb6wPOA==
Decrypt: some val