Я реализую метод шифрования с помощью ключа, и я сделал вызов, подобный этому:
Crypto c = new Crypto("mysecretkey");
String enc = c.encrypt("mytext");
Но я получаю исключение
"Ошибка криптографического шифрования:Индекс строки вне диапазона: -1 "
в этой части:
String sKeyChar = getKey().substring((i % getKey().length()) - 1, 1);
И я не знаю, что я делаю неправильно, потому что я сделал то же самое в PHPи работает хорошо.Может быть, это просто, но я застрял, это мой метод:
public String encrypt(String sData) {
String sEncrypted = null;
try {
String sResult = null;
for (int i = 0; i < sData.length(); i++) {
String sChar = sData.substring(i, 1);
String sKeyChar = getKey().substring((i % getKey().length()) - 1, 1);
char c = (char) (ord(sChar) - ord(sKeyChar));
String sPart = (new StringBuffer().append(c)).toString();
sResult += sPart;
}
byte[] sResultBuff = sResult.getBytes("UTF-8");
sEncrypted = Base64.encode(sResultBuff);
} catch (Exception e) {
System.out.println("crypto encrypt error: " + e.getMessage());
sEncrypted = null;
}
return sEncrypted;
}
Другой необходимый метод:
public int ord(String sChar) {
int ascii_code = 0;
try {
ascii_code = String.valueOf(sChar.charAt(0)).codePointAt(0);
} catch (Exception e) {
System.out.println("crypto ord error: " + e.getMessage());
ascii_code = 0;
}
return ascii_code;
}
PHP эквивалентный метод:
function encrypt($sData, $sKey='mysecretkey'){
$sResult = '';
for($i=0;$i<strlen($sData);$i++){
$sChar = substr($sData, $i, 1);
$sKeyChar = substr($sKey, ($i % strlen($sKey)) - 1, 1);
$sChar = chr(ord($sChar) + ord($sKeyChar));
$sResult .= $sChar;
}
return encode_base64($sResult);
}
Спасибо!