Elikill58
Elikill58

Reputation: 4908

How to encrypt a string with another key?

I have a string than I want to encrypt to send it over an insecure channel.

I want to:

Convert to int my-val & my-private-key. Then, multiply both. Send it. When receiving it, divide by my-private-key converted as int and get my-val.

I tried to used Integer.parseInt and Integer.toString as suggested here. It seems to work with System.out.println(Integer.parseInt("Kona", 27)); (as Java's documentation said)

So I made this:

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));

But I get Exception in thread "main" java.lang.NumberFormatException: For input string: "some val" at the 4st line.

I tried with base 10, 16, 27, 32. Even if I understand why 10 & 16 doesn't work, why 27 & 32 don't ? How can I fix it ?

Upvotes: 0

Views: 2753

Answers (2)

Elikill58
Elikill58

Reputation: 4908

I was looking to encrypt with another string. I get the idea to multiply both, and so convert them into int. But, it seems to have informations lost with operation.

So, I searched for another way, and I found this one:

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)));
}

How it works ? It encrypt and decrypt with a key. This key should be a 16-chars one. Also, to make it easier to show/send/receive, it's converted into base 64.

Example of how to use:

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

Output:

Encrypt: ERJZ7ZOJcNpQEAvrb6wPOA==
Decrypt: some val

Upvotes: 1

Sandip Patel
Sandip Patel

Reputation: 33

Based on below wikipedia link of numeral system, Java will check each character of your input string against the range of radix parameter and if its not in range than it will throw exception.

Visit https://en.wikipedia.org/wiki/List_of_numeral_systems,

Apart from that, Below is explanation from geeksforgeek site.

  • The string is null or of zero-length
  • The value represented by the string is not a value of type int
  • Specifically for the parseInt(String s, int radix) variant of the function:
    • The second argument radix is either smaller than Character.MIN_RADIX or larger than Character.MAX_RADIX *

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

  • Any character of the string is not a digit of the specified radix, except that the first character may be a minus sign ‘-‘ (‘\u002D’) or plus sign ‘+’ (‘\u002B’) provided that the string is longer than length 1

Custom logic for conversion

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);

Above code is taken Converting name to a key using radix-26

Upvotes: 2

Related Questions