Avatar billede machholdt Nybegynder
06. september 2010 - 19:39 Der er 8 kommentarer og
2 løsninger

Opgave om simpel Kryptering i Java - How to program.

Hej

Opgaven er 4.35 i Java-how to program international edt.

Programmet skal fra brugeren få et tal (4 char langt) og trække hvert char ud, plusse med 7, og derefter tage remainderen efter at have divideret tallet op i 10. Tilsidst byttes rundt på tallene.

Jeg har fået lavet den der kan kode det, men kan ikke lure hvordan jeg skal afkode det med remainderen, nogen der har nogle ideer?

Smider koden til selve krypteringen her:

public class EnforcingPrivacyWithCryptography
{
    String volapyk1 ;
    String translatedNumberString;
    String theNumberString;
    int counter = 0, theNumber = 0,tal1,tal2,tal3,tal4;
   
    public EnforcingPrivacyWithCryptography(String volapyk2)
    {
        volapyk1 = volapyk2;
    }
    public void doTranslation()
    {
        while (counter < 4)
        {
            theNumberString = volapyk1.substring(counter, counter+1);
            theNumber = Integer.parseInt(theNumberString);
            // Encryption starts here.
            theNumber = theNumber+7;
            theNumber = theNumber % 10;
           
            if (counter == 0)
            {
                tal1=theNumber;
            }
            if (counter == 1)
            {
                tal2=theNumber;
            }
            if (counter == 2)
            {
                tal3=theNumber;
            }
            if (counter == 3)
            {
                tal4=theNumber;
            }
            counter++;
        }
    }
    public String getTranslation()
    {
        translatedNumberString = ""+ tal3 + "" + tal4 + "" + tal1+"" +tal2;
       
        return translatedNumberString;
    }
    public void undoTranslation()
    {
        while (counter < 4)
        {
            theNumberString = volapyk1.substring(counter, counter+1);
            theNumber = Integer.parseInt(theNumberString);
            // Decryption starts here.
                       
            if (counter == 0)
            {
                tal3=theNumber;
            }
            if (counter == 1)
            {
                tal4=theNumber;
            }
            if (counter == 2)
            {
                tal1=theNumber;
            }
            if (counter == 3)
            {
                tal2=theNumber;
            }
            counter++;
           
        }
    }
}
Avatar billede arne_v Ekspert
06. september 2010 - 22:59 #1
Prøv og kør dette program:

public class NumberEncryptDecrypt {
    public static int encrypt(int v) {
        return (v + 7) % 10;
    }
    public static int decrypt(int v) {
        return (v + 3) % 10;
    }
    public static void main(String[] args) {
        for(int i = 0; i < 10; i++) {
            System.out.println(i + " " + encrypt(i) + " " + decrypt(encrypt(i)));
        }
    }
}
Avatar billede arne_v Ekspert
06. september 2010 - 23:00 #2
Iøvrigt ville jeg nok bruge en for løkke fremfor en while løkke her!
Avatar billede machholdt Nybegynder
07. september 2010 - 09:58 #3
Hey igen

Er ikke helt med på hvordan jeg skal bruge det du skriver. Har taget en del af det og smidt ind under hver if sætning i decrypteringen. Som nævnt er det kun decrypteringen der ikke virker, kan sagtens kryptere et tal. Men når jeg så forsøger at oversætte det "tilbage" til det første tal kan jeg ikke regne ud hvordan jeg skal lave det med en remainder omvendt.
hvis jeg har et 1-tal: ((1+7) % 10) hvordan laver jeg denne aktion omvendt, så jeg når jeg har 8 kan få et 1-tal igen?


public class EnforcingPrivacyWithCryptography
{
    String volapyk1 ; String translatedNumberString; String theNumberString;
    int counter = 0, theNumber = 0,tal1,tal2,tal3,tal4;
   
    public EnforcingPrivacyWithCryptography(String volapyk2)
    {
        volapyk1 = volapyk2;
    }
    public void doTranslation()
    {
        while (counter < 4)
        {
            theNumberString = volapyk1.substring(counter, counter+1);
            theNumber = Integer.parseInt(theNumberString);
            // Encryption starts here.
            theNumber = theNumber+7;
            theNumber = theNumber % 10;
            if (counter == 0)
            {
                tal1=theNumber;
            }
            if (counter == 1)
            {
                tal2=theNumber;
            }
            if (counter == 2)
            {
                tal3=theNumber;
            }
            if (counter == 3)
            {
                tal4=theNumber;
            }
            counter++;
        }
    }
    public String getTranslation()
    {
        translatedNumberString = ""+ tal3 + "" + tal4 + "" + tal1+"" +tal2;
       
        return translatedNumberString;
    }
    public void undoTranslation()
    {
        while (counter < 4)
        {
            theNumberString = volapyk1.substring(counter, counter+1);
            theNumber = Integer.parseInt(theNumberString);
            // Decryption starts here.
            if (counter == 0)
            {
                tal3=theNumber;
                tal3=(tal3 + 3) % 10;
            }
            if (counter == 1)
            {
                tal4=theNumber;
                tal4=(tal4 + 3) % 10;
            }
            if (counter == 2)
            {
                tal1=theNumber;
                tal1=(tal1 + 3) % 10;
            }
            if (counter == 3)
            {
                tal2=theNumber;
                tal2=(tal2 + 3) % 10;
            }
            counter++;
        }
    }
    public String getUndoneTranslation()
    {
        translatedNumberString = ""+ tal1 + "" + tal2 + "" + tal3+"" +tal4;
        return translatedNumberString;
    }
}
Avatar billede Bamma Nybegynder
07. september 2010 - 14:25 #4
problemet er du tager de gamle tal igen i undoTranslate, du skal bruge de tal du allerede har gemt.
public void undoTranslation()
{
    tal1=(tal1 + 3) % 10;
    tal2=(tal2 + 3) % 10;
    tal3=(tal3 + 3) % 10;
    tal4=(tal4 + 3) % 10;
}
ville jeg lave det ud fra din kode.
Avatar billede machholdt Nybegynder
07. september 2010 - 17:29 #5
HEHE. Bamma. Tak for hjælpen, lidt dum fejl.
I deler points da metoden som Arne V gav egetnlig var det jeg spurgte om selvom der også var yderligere fejl i koden. Læg venligst svar begge.
Avatar billede machholdt Nybegynder
07. september 2010 - 17:29 #6
Her er koden som løste det, hbvis det kunne have interesse.

public class EnforcingPrivacyWithCryptography
{
    String volapyk1 ; String translatedNumberString; String theNumberString; String translatedNumberString2;
    int theNumber = 0,tal1,tal2,tal3,tal4;
   
    public EnforcingPrivacyWithCryptography(String volapyk2)
    {
        volapyk1 = volapyk2;
    }
    public void doTranslation()
    {
        for (int counter = 0; counter < 4; counter++)
        {
            theNumberString = volapyk1.substring(counter, counter+1);
            theNumber = Integer.parseInt(theNumberString);
            // Encryption starts here.
            theNumber = theNumber+7;
            theNumber = theNumber % 10;
            if (counter == 0)
            {
                tal1=theNumber;
            }
            if (counter == 1)
            {
                tal2=theNumber;
            }
            if (counter == 2)
            {
                tal3=theNumber;
            }
            if (counter == 3)
            {
                tal4=theNumber;
            }
        }
    }
    public String getTranslation()
    {
        translatedNumberString = ""+ tal3 + "" + tal4 + "" + tal1+"" +tal2;
       
        return translatedNumberString;
    }
    public void undoTranslation()
    {
        for (int counter = 0; counter < 4; counter++)
        {
            translatedNumberString2 = translatedNumberString.substring(counter, counter+1);
            theNumber = Integer.parseInt(translatedNumberString2);
            // Decryption starts here.
            if (counter == 0)
            {
                tal3=theNumber;
                tal3=(tal3 + 3) % 10;
            }
            if (counter == 1)
            {
                tal4=theNumber;
                tal4=(tal4 + 3) % 10;
            }
            if (counter == 2)
            {
                tal1=theNumber;
                tal1=(tal1 + 3) % 10;
            }
            if (counter == 3)
            {
                tal2=theNumber;
                tal2=(tal2 + 3) % 10;
            }
        }
    }
    public String getUndoneTranslation()
    {
        translatedNumberString2 = ""+ tal1 + "" + tal2 + "" + tal3+"" +tal4;
        return translatedNumberString2;
    }
}
Avatar billede arne_v Ekspert
08. september 2010 - 19:56 #7
svar fra mig
Avatar billede arne_v Ekspert
08. september 2010 - 19:56 #8
Og en lidt anden maade at loese opgaven paa:

public class Privacy {
    public static int encrypt(int v, int offset) {
        if(v < 0 || v > 9) throw new IllegalArgumentException("Non digit in string");
        return (v + offset) % 10;
    }
    public static int decrypt(int v, int offset) {
        if(v < 0 || v > 9) throw new IllegalArgumentException("Non digit in string");
        return (v - offset + 10) % 10;
    }
    public static String encrypt(String s, int offset, int[] ix) {
        if(s.length() != ix.length) throw new IllegalArgumentException("String and index of different length");
        char[] c = new char[s.length()];
        for(int i = 0; i < s.length(); i++) {
            c[ix[i]] = (char)(encrypt(s.charAt(i) - '0', offset) + '0');
        }
        return new String(c);
    }
    public static String decrypt(String s, int offset, int[] ix) {
        if(s.length() != ix.length) throw new IllegalArgumentException("String and index of different length");
        char[] c = new char[s.length()];
        for(int i = 0; i < s.length(); i++) {
            c[i] = (char)(decrypt(s.charAt(ix[i]) - '0', offset) + '0');
        }
        return new String(c);
    }
    public static void main(String[] args) {
        String s1 = "1357";
        String s2 = encrypt(s1, 7, new int[] { 2, 3, 0, 1 });
        String s3 = decrypt(s2, 7, new int[] { 2, 3, 0, 1 });
        System.out.println(s1 + " -> " + s2 + " -> " + s3);

    }
}
Avatar billede Bamma Nybegynder
09. september 2010 - 09:06 #9
Hehe, ville nu mene arne har fortjent svaret
Avatar billede machholdt Nybegynder
11. september 2010 - 18:23 #10
Inspirerende løsningsforslag. Dog umiddelbart for avanceret til mig på mit nuværende niveau. :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester