如何用另一个密钥加密字符串?
How to encrypt a string with another key?
我有一个字符串,我想加密以通过不安全的通道发送它。
我想:
转换为整数 my-val
& my-private-key
。然后,将两者相乘。发送。接收时除以my-private-key
转换为int得到my-val
.
我尝试按照 here 的建议使用 Integer.parseInt
和 Integer.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
我有一个字符串,我想加密以通过不安全的通道发送它。
我想:
转换为整数 my-val
& my-private-key
。然后,将两者相乘。发送。接收时除以my-private-key
转换为int得到my-val
.
我尝试按照 here 的建议使用 Integer.parseInt
和 Integer.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