Скрипт Java для JS и расшифровать - PullRequest
0 голосов
/ 14 мая 2018

Кто-нибудь знает, как зашифровать в java и расшифровать в nodejs?Независимо от алгоритма, aes / cbc будет лучше, но это не имеет значения.

После нескольких дней и дней поиска решения кажется, что алгоритм не совпадает в двух языках.

Вот мой код в kotlin / java:

override fun onCreate(savedInstanceState: Bundle?)
{
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val text = "Hello everybody !"
    val password = "1234567812345678"

    val encrypted = encrypt(text, password)
    Log.i("MainActivity", "encrypted = $encrypted")
    val decrypted = decrypt(encrypted, password)
    Log.i("MainActivity", "decrypted = $decrypted")
}

private fun encrypt(text: String, password: String): String
{
    val keySpec = SecretKeySpec(password.toByteArray(), "AES")
    val ivSpec = IvParameterSpec(password.toByteArray())
    val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec)

    val results = cipher.doFinal(text.toByteArray())

    return Base64.encodeToString(results, Base64.NO_WRAP or Base64.DEFAULT)
}

private fun decrypt(text: String, password: String): String
{
    val keySpec = SecretKeySpec(password.toByteArray(), "AES")
    val ivSpec = IvParameterSpec(password.toByteArray())
    val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
    cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec)

    return String(cipher.doFinal(Base64.decode(text, Base64.DEFAULT)))
}

, а вот мой код в nodejs:

var crypto = require('crypto');


var text = "Hello everybody !"
var password = new Buffer("1234567812345678")
console.log("Password = " + password)


var encrypted = encrypt(text, password)
console.log("Encrypted = " + encrypted)

var decrypted = decrypt(encrypted, password)
console.log("Decrypted = " + decrypted)

function encrypt(data, password)
{
    var cipher = crypto.createCipheriv('aes-128-cbc', password, password);
    var crypted = cipher.update(data, 'utf8', 'hex');
    crypted += cipher.final('hex');
    return crypted;
}

function decrypt(data, password)
{
    var decipher = crypto.createDecipheriv('aes-128-cbc', password, password);
    var dec = decipher.update(data, 'hex', 'utf8');
    dec += decipher.final('utf8');
    return dec;
}

Я уже прочитал все учебники об этом, но ничего не работает.

1 Ответ

0 голосов
/ 14 мая 2018

Если вы намереваетесь использовать свой код с такими строками, ваш код почти полностью корректен. Вы просто используете неправильную кодировку в node.js part.

Изменить шифрование и дешифрование node.js на base64 следующим образом:

function encrypt(data, password)
{
    var cipher = crypto.createCipheriv('aes-128-cbc', password, password);
    var crypted = cipher.update(data, 'utf8', 'base64');
    crypted += cipher.final('base64');
    return crypted;
}

function decrypt(data, password)
{
    var decipher = crypto.createDecipheriv('aes-128-cbc', password, password);
    var dec = decipher.update(data, 'base64', 'utf8');
    dec += decipher.final('utf8');
    return dec;
}

и изменить кодировку base64 в части java следующим образом:

private fun encrypt(text: String, password: String): String
{
    ...
    return Base64.getEncoder().encodeToString(results)
}

private fun decrypt(text: String, password: String): String
{
    ...
    return String(cipher.doFinal(Base64.getDecoder().decode(text)))
}

Теперь результат шифрования / дешифрования Java и node.js совпадает. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...