Код следует, но сначала несколько примечаний.
- Для каждого сообщения должен быть выбран другой вектор инициализации. Жесткое кодирование вектора инициализации не имеет смысла. IV должен быть отправлен вместе с текстом шифра получателю сообщения (это не секрет).
- Я использовал свой собственный служебный класс для кодирования base-64. Вместо этого вы можете использовать
sun.misc.BASE64Encoder
и sun.misc.BASE64Decoder
, использовать стороннюю библиотеку, например BouncyCastle, или написать свою собственную.
- Вы используете тройной DES с двумя ключами, где первый ключ и третий ключ одинаковы. Я изменил
sharedkey
, чтобы отразить это, поскольку шифр Java DESede всегда требует 192-битный ключ; это зависит от генератора ключей, чтобы обработать ключ.
- CBC IV - только 64 бита. Я использовал только первые 64 бита
sharedvector
.
Этот класс должен взаимодействовать с версией C #.
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Encryption
{
private static byte[] sharedkey = {
0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11,
0x12, 0x11, 0x0D, 0x0B, 0x07, 0x02, 0x04, 0x08,
0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11
};
private static byte[] sharedvector = {
0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11
};
public static void main(String... argv)
throws Exception
{
String plaintext = "userNameHere:passwordHere";
String ciphertext = encrypt(plaintext);
System.out.println(ciphertext);
System.out.println(decrypt(ciphertext));
}
public static String encrypt(String plaintext)
throws Exception
{
Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sharedkey, "DESede"), new IvParameterSpec(sharedvector));
byte[] encrypted = c.doFinal(plaintext.getBytes("UTF-8"));
return Base64.encode(encrypted);
}
public static String decrypt(String ciphertext)
throws Exception
{
Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, new SecretKeySpec(sharedkey, "DESede"), new IvParameterSpec(sharedvector));
byte[] decrypted = c.doFinal(Base64.decode(ciphertext));
return new String(decrypted, "UTF-8");
}
}
Выход:
zQPZgQHpjxR + 41Bc6 + 2Bvqo7 + pQAxBBVN + 0V1tRXcOc =
userNameHere: passwordHere