Programim dhe zhvillim, javascript, python, php, html

Përjashtim në algoritmin e deshifrimit AES në java

Kam një përjashtim në kodin e mëposhtëm për algoritmin AES në java.

Kodi deshifron një varg të koduar dhe kthen vargun origjinal.

Ju lutem më ndihmoni ta rregulloj këtë.

Kodi:

public class AES 

{

public byte[] encrypted;

 public byte[] original;

 public String originalString;

public static String asHex (byte buf[]) 

{ 

StringBuffer strbuf = new StringBuffer(buf.length * 2);

 int i; for (i = 0; i < buf.length; i++) 

{

 if (((int) buf[i] & 0xff) < 0x10) strbuf.append("0"); 

strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); 

}

 return strbuf.toString();

 }

 public String AESencryptalgo(byte[] text)

 { 

String newtext=""; 

// Get the KeyGenerator

 try

 {

    KeyGenerator kgen = KeyGenerator.getInstance("AES");

    kgen.init(128); // 192 and 256 bits may not be available

 // Generate the secret key specs. 

SecretKey skey = kgen.generateKey();

 byte[] raw = skey.getEncoded();

 SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

 // Instantiate the cipher Cipher cipher = Cipher.getInstance("AES"); 

cipher.init(Cipher.ENCRYPT_MODE, skeySpec); encrypted = cipher.doFinal(text); 

System.out.println("encrypted string: " + asHex(encrypted)); 

cipher.init(Cipher.DECRYPT_MODE, skeySpec); original = cipher.doFinal(encrypted); 

originalString = new String(original); System.out.println("Original string: " + originalString + " " + asHex(original));

 } 

catch(Exception e)

 { } 

finally 

{

 newtext=new String(encrypted);

 System.out.println("ENCRYPTED "+newtext);

//AESdecryptalgo(newtext.getBytes()); 

return newtext;

 }

 } 

public String AESdecryptalgo(byte[] text)

 { 

// Get the KeyGenerator

 try

 {

 KeyGenerator kgen = KeyGenerator.getInstance("AES");

 kgen.init(128); // 192 and 256 bits may not be available 

// Generate the secret key specs. 

SecretKey skey = kgen.generateKey();

 byte[] raw = skey.getEncoded(); 

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 

// Instantiate the cipher

 Cipher cipher = Cipher.getInstance("AES"); 

cipher.init(Cipher.DECRYPT_MODE, skeySpec);

 original = cipher.doFinal(text); //Exception occurs here

 originalString = new String(original);

 System.out.println("Original string: " + originalString + " " + asHex(original)); 

}

 catch(Exception e)

 {

 System.out.println("exception"); 

}

 finally

{ 

System.out.println("DECRYPTED "+originalString);

 return originalString;

 } 

} 

public static void main(String[] args)

{

AES a=new AES();

a.AESencryptalgo("hello".getBytes());

System.out.println(); 

}} 
`

përjashtim:

javax.crypto.BadPaddingException: Given final block not properly padded at  
com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) at
com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) at
com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..) at
javax.crypto.Cipher.doFinal(DashoA13*..) 
05.07.2010

  • ju duhet të riformatoni kodin tuaj 05.07.2010
  • @ Xavier Combelle kam riformatuar 05.07.2010
  • @user: Cili është përjashtimi? Të paktën zëvendësoni println-në tuaj me e.printStackTrace() dhe raportoni përsëri. 05.07.2010
  • @theatrus: Përjashtim është: Gjatësia e hyrjes duhet të jetë shumëfish i 16 kur deshifrohet me shifra të mbushura 05.07.2010
  • Gjurma e stivës: javax.crypto.BadPaddingException: Blloku përfundimtar i dhënë nuk është mbushur siç duhet në com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) në com.sun.crypto.provider.SunJCE_f.b(DashoA13*. ) në com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..) në javax.crypto.Cipher.doFinal(DashoA13*..) 05.07.2010

Përgjigjet:


1

Sipas Architecture Cryptography Java™ (JCA) Udhëzues referimi (theksi i imi):

Objektet Cipher merren duke përdorur një nga Cipher getInstance() metoda statike të fabrikës. Këtu, emri i algoritmit është paksa i ndryshëm nga klasat e tjera të motorit, në atë që specifikon jo vetëm një emër algoritmi, por një "transformim". Një transformim është një varg që përshkruan operacionin (ose grupin e operacioneve) që do të kryhet në hyrjen e dhënë për të prodhuar disa rezultate. Një transformim përfshin gjithmonë emrin e një algoritmi kriptografik (p.sh., DES), dhe mund të pasohet nga një skemë modaliteti dhe mbushjeje.

Një transformim është i formës:

  • "algoritmi/modaliteti/mbushja" ose
  • "algoritmi"

Për shembull, transformimet e mëposhtme janë të vlefshme:

  • "DES/CBC/PKCS5Padding"
  • "DES"

Nëse specifikohet vetëm një emër transformimi, sistemi do të përcaktojë nëse ka një implementim të transformimit të kërkuar të disponueshëm në mjedis, dhe nëse ka më shumë se një, kthen atje një të preferuar.

Nëse specifikohet emri i transformimit dhe ofruesi i paketës, sistemi do të përcaktojë nëse ka një zbatim të transformimit të kërkuar në paketën e kërkuar dhe do të bëjë një përjashtim nëse nuk ka.

Nëse nuk është specifikuar asnjë modalitet ose mbushje, përdoren vlerat e paracaktuara specifike të ofruesit për skemën e modalitetit dhe mbushjes. Për shembull, ofruesi SunJCE përdor ECB si modalitetin e paracaktuar dhe PKCS5Padding si skemën e paracaktuar të mbushjes për shifrat DES, DES-EDE dhe Blowfish. Kjo do të thotë që në rastin e ofruesit SunJCE:

Cipher c1 = Cipher.getInstance("DES/ECB/PKCS5Padding");

dhe

Cipher c1 = Cipher.getInstance("DES");

janë deklarata ekuivalente.

Duke përdorur mënyra të tilla si CFB dhe OFB, shifrat e bllokut mund të enkriptojnë të dhënat në njësi më të vogla se madhësia aktuale e bllokut të shifrës. Kur kërkoni një modalitet të tillë, mund të specifikoni opsionalisht numrin e biteve që do të përpunohen në të njëjtën kohë duke ia shtuar këtë numër emrit të modalitetit siç tregohet në "DES/CFB8/NoPadding" dhe "DES/OFB32/PKCS5Padding". Nëse nuk specifikohet një numër i tillë, përdoret një parazgjedhje specifike e ofruesit. (Për shembull, ofruesi SunJCE përdor një parazgjedhje prej 64 bitësh për DES.) Kështu, shifrat e bllokut mund të shndërrohen në shifra të transmetimit të orientuar nga bajt duke përdorur një modalitet 8 bit si CFB8 ose OFB8.

Shtojca A i këtij dokumenti përmban një listë me emra standardë që mund të përdoren për të specifikuar emrin e algoritmit, modalitetin dhe komponentët e skemës së mbushjes së një transformimi.

Objektet e kthyera nga metodat e fabrikës nuk janë inicializuar dhe duhet të inicializohen përpara se të bëhen të përdorshëm.

Për shkak se kodi juaj nuk specifikon modalitetin ose mbushjen, po përdoren vlerat e paracaktuara specifike të ofruesit. Duket se ofruesi juaj është SunJCE dhe se mbushja e parazgjedhur është ndoshta "NoPadding". Me këtë mbushje, ju jeni përgjegjës për të siguruar që madhësia e grupit të bajtit që kodohet është një shumëfish i numrit të bajteve në çelësin sekret. Ju mund ta bëni jetën tuaj më të lehtë duke specifikuar modalitetin dhe mbushjen në transformimin tuaj:

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

PARALAJMËRIM: Nuk duhet të përdorni modalitetin ECB në kodin real. Provo CBC në vend të kësaj.

Përditësim: Mendova se nuk ishte e drejtë të rekomandoja modalitetin CBC pa ofruar një shembull të vogël se si funksionon:

public static void main(String... args) throws Exception {
    byte[] data = "hello".getBytes();

    KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(128); // 192 and 256 bits may not be available

    SecretKey secretKey = keyGenerator.generateKey();

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

    // By initializing the cipher in CBC mode, an "initialization vector" has been randomly
    // generated. This initialization vector will be necessary to decrypt the encrypted data.
    // It is safe to store the initialization vector in plain text for later use. You can obtain
    // it's bytes by calling iv.getIV().
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    IvParameterSpec iv = cipher.getParameters().getParameterSpec(IvParameterSpec.class);
    byte[] encryptedData = cipher.doFinal(data);

    // When decrypting the encrypted data, you must provide the initialization vector used
    // during the encryption phase.
    cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
    byte[] decryptedData = cipher.doFinal(encryptedData);

    if (!Arrays.equals(data, decryptedData)) {
        throw new Exception("Data was not decrypted successfully");
    }
}
05.07.2010
  • Jo, po marr përjashtim ligjor të madhësisë së bllokut. Versioni i ri i kodit është në.... stackoverflow.com/questions/3181535/ 06.07.2010

  • 2

    Epo, nëse ky është gabimi, gjatësia e hyrjes duhet të jetë shumëfish i 16 kur deshifrohet me një shifër të mbushur. Pasi që përgjigja është e qartë, gjatësia e tamponit tuaj duhet të jetë shumëfish i 16. A e keni kontrolluar gjatësinë e buf[]?

    05.07.2010

    3

    Kodi juaj arrin të gabojë pothuajse çdo gjë. Vetëm për fillim, gabimet tuaja përfshijnë:

    1. gjenerimi i një çelësi të ri simetrik të rastësishëm përpara kriptimit dhe deshifrimit. Duhet të përdorni të njëjtin çelës për të deshifruar që është përdorur për të kriptuar.
    2. Përdorimi i String si një kontejner për të dhënat binare. Prodhimi i shifrës nuk mund të shndërrohet në mënyrë të besueshme në një varg nëse nuk përdorni një kodim, si p.sh. base64.
    3. Trajtimi juaj i përjashtimit është i pasaktë.

    Për më tepër, kodi juaj funksionon pa përjashtime për mua.

    05.07.2010
    Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..