Witam,
Mam taki problem pisze program który z pliku txt wyciąga całą zawartość i zapisuje do stringa następnie z powrotem zapisuje po zmianie do pliku txt teraz chciałbym w prosty sposób zaszyfrować tego stringa zanim go zapisze do pliku. Ważne aby później łatwo było go odszyfrować. Będę wdzięczny za każdy pomysł.
xor?
z tego co teraz wyczytałem to muszę zamienić ten tekst na liczby dziesiętne potem na binarne ? i zrobić xor ?
hmm może ktoś poda działający przykład bo nie wygląda to prosto ..
Wszystkie dane w komputerze są przechowywane jako dane binarne... Wystarczy ci po prostu xorować kolejne znaki z tekstu z jakimiś znakami z klucza. Odszyfrowanie wygląda identycznie.
Ten kod zamienia mi tekst ze stringa na binarny a jak zrobić żeby ten proces odwrócić ? I jak gdy np juz mam binarną litere np m = 01101101 z xor'ować ją np kodem 10101010? wiem tylko że c=a^b ale jak to w praktyce napisać ?
String omg = "Zupa";
byte[] bytes = omg.getBytes();
StringBuilder binary = new StringBuilder();
for (byte b : bytes)
{
int val = b;
for (int i = 0; i < 8; i++)
{
binary.append((val & 128) == 0 ? 0 : 1);
val <<= 1;
}
binary.append(' ');
}
System.out.println(omg + "\nTo binary: " + binary);
</code=java>
Przecież jak nie musisz to nie zamieniaj na binarne, po prostu każdą literę string'a xornij z kluczem (zależy jak jeszcze go używasz), czyli dostępem do każdego znaku xorujesz, a potem na odwrót też xorujesz z tym, że to co już masz zaszyfrowane xorujesz znowu z kluczem.
brzmi to faktycznie łatwiej .. mam mega prośbę mógłby ktoś pokazać jakiś przykład jak stringa Xor'ować nawet najprostszy
public class Main {
static byte[] cipher(byte[] data, byte[] key) {
for(int i = 0; i < data.length; i++) {
data[i] = (byte) (data[i] ^ key[i % key.length]);
}
return data;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
byte[] coded = cipher("Test".getBytes(), "My key".getBytes());
System.out.println("Zakodowane: ");
for (byte b : coded) {
System.out.printf("%c", b);
}
System.out.println();
System.out.println("Odkodowane: ");
byte[] decoded = cipher(coded, "My key".getBytes());
for (byte b : decoded) {
System.out.printf("%c", b);
}
}
}
Teoretycznie jeśli klucz będzie dostatecznie długi to złamanie zwykłego XOR'a graniczyć będzie z cudem :P
A no się trochę spóźniłem :D
Ogólny zarys o co chodzi (C#):
static string Encode(string _text, string key)
{
StringBuilder text = new StringBuilder(_text);
for (int i = 0; i < text.Length; i++)
{
text[i] = (char)((int)text[i] ^ key[i % key.Length]); // xorowanie każdego znaku z każdym znakiem klucza
}
return text.ToString();
}
static string Decode(string _text, string key)
{
StringBuilder text = new StringBuilder(_text);
for (int i = 0; i < text.Length; i++)
{
text[i] = (char)((int)text[i] ^ key[i % key.Length]); // to samo tylko, że odszyfrowuje
}
return text.ToString();
}
static void Main(string[] args)
{
string napis = "ale-fajny-napis";
string klucz = "mój-tajny-klucz";
Console.WriteLine("Zaszyfrowany napis: " + Encode(napis, klucz));
Console.WriteLine("Odszyfrowany napis: " + Decode(Encode(napis, klucz), klucz));
Console.Read();
}
Eureka działa :PP hmm musze dokładnie przeanalizować te przykłady ;) ale wieeeelkie dzięki dla WAS ;D
czy jest możliwość zapisania zawartość byte b do pliku txt ? ze string'iem nie mam problemu , próbowałem też przerobić ten byte na string ale bez sukcesu :| no i potem jest jeszcze kwestia w drugą stronę z pliku do byte .
do odczytywania i zapisywania używam tego:
RandomAccessFile raf = null;
System.out.println(".:: PROGRAM EDYTOR TEKSTU ::.");
System.out.print("Podaj nazwe pliku: ");
BufferedReader pyt1 = new BufferedReader(new InputStreamReader(System.in), 1);
nazw = pyt1.readLine();
try {
raf = new RandomAccessFile(nazw, "rw");
} catch (FileNotFoundException e) {
System.out.println("BŁĄD PRZY OTWIERANIU PLIKU!");
System.exit(1);
}
String tekst="";
long pozycja=0, dlugoscpliku=0;
// SWOBODNY ODCZYT Z PLIKU
try {
dlugoscpliku = raf.length();
System.out.println("\nDlugość twojego pliku: " + dlugoscpliku);
raf.seek(0); // "skok" na początek pliku
while (pozycja < dlugoscpliku){
tekst +=raf.readLine()+"\n";
pozycja= raf.getFilePointer();
}
System.out.println(tekst);
} catch (IOException e1) {
System.out.println("BŁĄD ODCZYTU Z PLIKU!");
System.exit(2);
}
StringBuffer sb = new StringBuffer(tekst);
FileOutputStream fos = null;
String str = new String(sb.toString());
try {
fos = new FileOutputStream(nazw); //Otwieranie pliku
for(int i = 0; i < str.length(); i++){
fos.write((int)str.charAt(i)); //Zapis bajt po bajcie każdego znaku...
}
System.out.println("\nPlik został poprawnie zapisany.");
} catch(IOException ex){
System.out.println("Błąd operacji na pliku: "+ex);
}
</code=java>
StringBuilder out = new StringBuilder();
for(byte b: data)
out.append((char)b);
mam taki drobny problemik wszystko praktycznie działa ale zapisuje słowo "matka" do pliku a odszyfrowuje z pliku mi słowo "mftka" ?? wie ktoś może dlaczego ?
else if (s.equals("szyfr")){
String tekst = new String(ta.getText());
byte[] coded = cipher(tekst.getBytes(), "klucz".getBytes());
System.out.println("Zakodowane: ");
for (byte b : coded) {System.out.printf("%c",b);}
StringBuilder out = new StringBuilder();
for(byte b: coded)
out.append((char)b);
FileOutputStream fos = null;
String str = new String(out.toString());
try {
fos = new FileOutputStream("zaszyfrowane.txt"); //Otwieranie pliku
for(int i = 0; i < str.length(); i++){
fos.write((int)str.charAt(i)); //Zapis bajt po bajcie każdego znaku...
}
System.out.println("\nZaszyfrowany tekst zastał zapisany w pliku 'zaszyfrowane.txt'.");
} catch(IOException ex){
System.out.println("Błąd operacji na pliku: "+ex);
}
}
else if (s.equals("odszyfr")){
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile("zaszyfrowane.txt", "rw");
} catch (FileNotFoundException e) {
System.out.println("BŁĄD PRZY OTWIERANIU PLIKU!");
System.exit(1);
}
String tekst="";
long pozycja=0, dlugoscpliku=0;
// SWOBODNY ODCZYT Z PLIKU
try {
dlugoscpliku = raf.length();
raf.seek(0); // "skok" na początek pliku
while (pozycja < dlugoscpliku){
tekst +=raf.readLine()+"\n";
pozycja= raf.getFilePointer();
}
} catch (IOException e1) {
System.out.println("BŁĄD ODCZYTU Z PLIKU!");
System.exit(2);
}
//stringvar.getBytes()
System.out.println();
System.out.println("Odkodowane: ");
byte[] decoded = cipher(tekst.getBytes(), "klucz".getBytes());
for (byte b : decoded) {
System.out.printf("%c", b);}
</code=java>
Zapisywanie:
String tekst = new String(ta.getText());
byte[] coded = cipher(tekst.getBytes(), "klucz".getBytes());
FileOutputStream fos = new FileOutputStream("zaszyfrowane.txt");
fos.write(coded);
Wczytywanie:
StringBuilder out = new StringBuilder();
byte[] buf = new byte[fileSize];
FileInputStream fis = new FileInputStream("zaszyfrowane.txt");
while(fis.read(data) != -1) {
out.append(new String(data));
}