Я предпочитаю TextMate на OS X. Но (многоплатформенный) Netbeans приходит вполне приятно. Плюс он идет с его IDE полностью функциональный отладчик.
Предупреждение
Не используйте это как своего рода мера безопасности.
Механизм шифрования в этом посте - одноразовый блокнот, что означает, что секретный ключ может быть легко восстановлен злоумышленником с помощью 2 зашифрованных сообщений. XOR 2 зашифрованные сообщения, и вы получите ключ. Так просто!
На что указывает Мусса
Я использую Sun Base64Encoder / Decoder, который можно найти в Sun JRE, чтобы избежать еще одного JAR в lib. Это опасно с точки зрения использования OpenJDK или какой-либо другой JRE. Кроме того, есть ли еще одна причина, по которой я должен рассмотреть возможность использования Apache Commons lib с кодировщиком / декодером?
public class EncryptUtils {
public static final String DEFAULT_ENCODING = "UTF-8";
static BASE64Encoder enc = new BASE64Encoder();
static BASE64Decoder dec = new BASE64Decoder();
public static String base64encode(String text) {
try {
return enc.encode(text.getBytes(DEFAULT_ENCODING));
} catch (UnsupportedEncodingException e) {
return null;
}
}//base64encode
public static String base64decode(String text) {
try {
return new String(dec.decodeBuffer(text), DEFAULT_ENCODING);
} catch (IOException e) {
return null;
}
}//base64decode
public static void main(String[] args) {
String txt = "some text to be encrypted";
String key = "key phrase used for XOR-ing";
System.out.println(txt + " XOR-ed to: " + (txt = xorMessage(txt, key)));
String encoded = base64encode(txt);
System.out.println(" is encoded to: " + encoded + " and that is decoding to: " + (txt = base64decode(encoded)));
System.out.print("XOR-ing back to original: " + xorMessage(txt, key));
}
public static String xorMessage(String message, String key) {
try {
if (message == null || key == null) return null;
char[] keys = key.toCharArray();
char[] mesg = message.toCharArray();
int ml = mesg.length;
int kl = keys.length;
char[] newmsg = new char[ml];
for (int i = 0; i < ml; i++) {
newmsg[i] = (char)(mesg[i] ^ keys[i % kl]);
}//for i
return new String(newmsg);
} catch (Exception e) {
return null;
}
}//xorMessage
}//class
Я бы рекомендовал использовать какой-нибудь стандартный симметричный шифр, который широко доступен, например DES , 3DES или AES . Хотя это не самый безопасный алгоритм, существует множество реализаций, и вам просто нужно предоставить ключ любому, кто должен расшифровать информацию в штрих-коде. javax.crypto.Cipher - это то, с чем вы хотите здесь работать.
Предположим, байты для шифрования находятся в
byte[] input;
Далее вам понадобится ключ и вектор инициализации bytes
byte[] keyBytes;
byte[] ivBytes;
Теперь вы можете инициализировать шифр для выбранного вами алгоритма:
// wrap key data in Key/IV specs to pass to cipher
SecretKeySpec key = new SecretKeySpec(keyBytes, "DES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
// create the cipher with the algorithm you choose
// see javadoc for Cipher class for more info, e.g.
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
Шифрование будет происходить следующим образом:
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] encrypted= new byte[cipher.getOutputSize(input.length)];
int enc_len = cipher.update(input, 0, input.length, encrypted, 0);
enc_len += cipher.doFinal(encrypted, enc_len);
А расшифровка будет выглядеть так:
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
byte[] decrypted = new byte[cipher.getOutputSize(enc_len)];
int dec_len = cipher.update(encrypted, 0, enc_len, decrypted, 0);
dec_len += cipher.doFinal(decrypted, dec_len);
Вот несколько ссылок, по которым вы можете прочитать, что поддерживает Java
Шифрование / дешифрование потока данных.
Этот пример демонстрирует, как зашифровать (используя симметричное шифрование алгоритм, такой как AES, Blowfish, RC2, 3DES и др.) Большой объем данных. В данные передаются частями в один из методы шифрования: EncryptBytes, EncryptString, EncryptBytesENC или EncryptStringENC. (Название метода указывает тип ввода (строка или байтовый массив) и возвращаемый тип (закодированная строка или байтовый массив). В Свойства FirstChunk и LastChunk используются, чтобы указать, является первым, средним или последним в поток, который нужно зашифровать. По умолчанию, оба FirstChunk и LastChunk равны true - означает, что данные прошли - вся сумма.