sposób na proste zaszyfrowanie stringa

0

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ł.

0

xor?

0

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 ..

0

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.

0

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>
0

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.

0

brzmi to faktycznie łatwiej .. mam mega prośbę mógłby ktoś pokazać jakiś przykład jak stringa Xor'ować nawet najprostszy

0
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

0

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();
		}
0

Eureka działa :PP hmm musze dokładnie przeanalizować te przykłady ;) ale wieeeelkie dzięki dla WAS ;D

0

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>
0
StringBuilder out = new StringBuilder();
for(byte b: data)
  out.append((char)b);
0

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>
0

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));
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1