Нужно реализовать шифрование по госту, нашел пример и на его основе наваял следующее -
public class gost28147_89 {
final private byte[] key;
public gost28147_89(String keyString) {
byte[] key = new byte[0];
try {
key = keyString.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new ThrowFabric.ForbiddenException("Кодировка UTF-8 не поддерживается");
}
if(key.length == 32)
this.key = key;
else{
this.key = null;
}
}
public String encrypt(String data) {
if(key.length != 32) return "";
return encrypt(data, true);
}
public String encrypt(String data, Boolean isEncrypt) {
if(key.length != 32) return "";
String result;
byte[] dataBytes;
try {
dataBytes = data.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new ThrowFabric.ForbiddenException("Кодировка UTF-8 не поддерживается");
}
BufferedBlockCipher cipher = new BufferedBlockCipher(new GOST28147Engine());
cipher.init(isEncrypt, new KeyParameter(key));
byte[] dataoOutBytes = new byte[cipher.getOutputSize(dataBytes.length)];
int len = cipher.processBytes(dataBytes, 0, dataBytes.length, dataoOutBytes, 0);
try {
cipher.doFinal(dataoOutBytes, len);
} catch (InvalidCipherTextException e) {
throw new ThrowFabric.ForbiddenException("Некорректный текст шифра");
}
result = Arrays.toString(dataoOutBytes);
return result;
}
public String decrypt(String data){
if(key.length != 32) return "";
return encrypt(data, false);
}
}
doFinal
вылетает с data not block size aligned\norg.bouncycastle.crypto.BufferedBlockCipher.doFinal(Unknown Source)
Кто нибудь работал с этой библиотекой? Не могу найти никакого описания как с ней работать...
UPDATE
Сделал по вашему примеру + подогнал блоки по размеру кратные 8. Шифрование/Дешифрование заработало, но выход после шифрования всегда на один блок(8 байт) больше входного массива.
byte[] dataBytes, tmpBytes;
tmpBytes = data.getBytes();
if(tmpBytes.length % 8 != 0){
dataBytes = new byte[tmpBytes.length + (8 - tmpBytes.length % 8)];
System.arraycopy(tmpBytes, 0, dataBytes, 0, tmpBytes.length);
} else{
dataBytes = tmpBytes;
}
BlockCipher engine = new GOST28147Engine();
BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(engine));
cipher.init(isEncrypt, new KeyParameter(key1));
byte[] cipherText = new byte[cipher.getOutputSize(dataBytes.length)];
int outputLen = cipher.processBytes(dataBytes, 0, dataBytes.length, cipherText, 0);
try {
cipher.doFinal(cipherText, outputLen);
} catch (InvalidCipherTextException e) {
throw new ThrowFabric.BadRequestException(e.getMessage());
}
result = new String(cipherText);
return result;
Любой блочный шифр (к каковым также и относится GOST 28147-89) умеет шифровать только 1 блок. Размер блока зависит от шифра, для GOST 28147-89 он равен 64 битам (8 байтам).
Алгоритм шифрования с применением блочного шифра обычно выглядит так:
Чтобы избежать всех этих сложностей придуман механизм простой инициализации, типа:
Cipher cipher = Cipher.getInstance("[Algorithm]/CBC/PKCS5Padding", <CryptoProvider>);
Который читается так: алгоритм [Algorithm]
, мода сцепления CBC
, алгоритм выравнивания PKCS5
, правда для этого криптопровайдер должен соответствовать определенным требованиям. Судя по всему у вас провайдер Bouncy Castle, соответственно строка инициализации Cipher
должна быть примерно такая:
Cipher cipher=Cipher.getInstance("GOST28147/CBC/PKCS5Padding", "BC");
Почитайте документацию Bouncy Castle или погуглите.
Update
Попробуйте так (аналог GOST28147/CBC/PKCS5Padding
):
BlockCipher engine = new GOST28147Engine();
BufferedBlockCipher cipher = new PaddedBlockCipher(new CBCCipher(engine));
byte[] key = keyString.getBytes();
byte[] input = inputString.getBytes();
cipher.init(true, new KeyParameter(key));
byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
int outputLen = cipher.processBytes(input, 0, input.length, cipherText, 0);
try
{
cipher.doFinal(cipherText, outputLen);
}
catch (CryptoException ce)
{
System.err.println(ce);
System.exit(1);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
У меня есть число int = 105; 1 это доллар а 05 в нем это центы, как правильнее преобразовать их? я пробовал через double но в итоге получил 15, а нужно...
В учебнике Герберта Шилдта "Java Полное руководство", написано, что созданный объект типа String неизменяем, а именно "после того, как объект типа...
Работаю над андроид игрушкой и вылазит ошибка