Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    15

    [Java] Javax.crypto, eccezione strana

    Stavo eseguendo delle prove di criptaggio e decriptaggio tramite javax.crypto, e finchè ho usato l'IV non ho avuto il minimo problema ad ottenere entrambe le cose. Tuttavia, nel programma in cui mi servono realmente queste due funzioni, non ho modo di gestire l'IV, perchè cripto dei singoli file e salvare l'IV nel nome è impossibile (non sono accettati come caratteri), e internamente è complicato in fase di lettura, quando va distinto dal resto del testo; ho pertanto cercato di capire se si può procedere senza: sia tramite documentazione (http://docs.oracle.com/javase/6/docs...to/Cipher.html), sia tramite un link passatomi da MItaly, sembra che si possa tranquillamente, ma quando tento di farlo ottengo un'eccezione che mi dice che manca l'IV o un altro parametro, la qual cosa mi lascia perplesso.

    Ecco la parte di codice interessata, in cui cripto e poi successivamente decripto senza IV:

    codice:
    String ktp="Cantami, o Diva, del Pelìde Achille l'ira funesta che infiniti addusse lutti agli Achei, molte anzi tempo all'Orco generose travolse alme d'eroi, e di cani e d'augelli orrido pasto lor salme abbandonò (così di Giove l'alto consiglio s'adempìa), da quando primamente disgiunse aspra contesa il re de' prodi Atride e il divo Achille. E qual de' numi inimicolli? Il figlio di Latona e di Giove. Irato al Sire destò quel Dio nel campo un feral morbo, e la gente perìa: colpa d'Atride che fece a Crise sacerdote oltraggio. Degli Achivi era Crise alle veloci prore venuto a riscattar la figlia con molto prezzo. In man le bende avea, e l'aureo scettro dell'arciero Apollo: e agli Achei tutti supplicando, e in prima ai due supremi condottieri Atridi: O Atridi, ei disse, o coturnati Achei, gl'immortali del cielo abitatori concedanvi espugnar la Prïameia cittade, e salvi al patrio suol tornarvi."; String key="3a+gmè120amsè°3b"; byte keyb[]=key.getBytes(); byte ini[]=ktp.getBytes(); Cipher cp=Cipher.getInstance("AES/CBC/PKCS5PADDING"); SecretKeySpec kps=new SecretKeySpec(keyb,"AES"); cp.init(Cipher.ENCRYPT_MODE,kps); byte fin[]=cp.doFinal(ini); String enc=new String(fin); System.out.println("Testo cifrato: "+enc); Cipher cp1=Cipher.getInstance("AES/CBC/PKCS5PADDING"); cp1.init(Cipher.DECRYPT_MODE,kps); byte alt[]=cp1.doFinal(fin); String dec=new String(alt); System.out.println("Testo decifrato: "+dec);
    E anche l'eccezione che ottengo:

    Exception in thread "main" java.security.InvalidKeyException: Parameters missing at com.sun.crypto.provider.CipherCore.init(CipherCore .java:388) at com.sun.crypto.provider.AESCipher.engineInit(AESCi pher.java:186) at javax.crypto.Cipher.implInit(Cipher.java:787) at javax.crypto.Cipher.chooseProvider(Cipher.java:849 ) at javax.crypto.Cipher.init(Cipher.java:1213) at javax.crypto.Cipher.init(Cipher.java:1153) at ProveHash.main(ProveHash.java:59)
    ProveHash è il nome del file, si chiama così perchè nella prima parte ho anche fatto delle prove di hash. La riga 59 del file è quella che contiene "cp1.init(Cipher.DECRYPT_MODE,kps);".
    Idee?

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    a parte che il tuo codice nemmeno si vede.
    Non puoi usare questo algoritmo di cifratura senza un adeguato IV. O trovi modo di portartelo dietro, o provi a seguire questo suggerimento oppure prova a usare come IV un array di zeri (0x00), quindi facile da impostare ovunque (perdi in sicurezza).

    Ripassa bene gli algoritmi di cifra e guarda bene i parametri necessari
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    15
    Perchè così aggressivo? Non mi pare di avere usato un tono simile o offensivo nella mia richiesta. Comunque, non me ne frega niente.

    Io il codice lo vedo perfettamente. Se preferisci, te lo metto in un tag quote:

    String ktp="Cantami, o Diva, del Pelìde Achille l'ira funesta che infiniti addusse lutti agli Achei"; String key="3a+gmè120amsè°3b"; byte keyb[]=key.getBytes(); byte ini[]=ktp.getBytes(); Cipher cp=Cipher.getInstance("AES/CBC/PKCS5PADDING"); SecretKeySpec kps=new SecretKeySpec(keyb,"AES"); cp.init(Cipher.ENCRYPT_MODE,kps); byte fin[]=cp.doFinal(ini); String enc=new String(fin); System.out.println("Testo cifrato: "+enc); Cipher cp1=Cipher.getInstance("AES/CBC/PKCS5PADDING"); cp1.init(Cipher.DECRYPT_MODE,kps); byte alt[]=cp1.doFinal(fin); String dec=new String(alt); System.out.println("Testo decifrato: "+dec);
    Dalla documentazione ufficiale, versione 7, voce Cipher (javax.crypto) (cito):

    void init(int opmode, Key key)
    Initializes this cipher with a key.
    e dentro alla spiegazione del metodo:

    The cipher is initialized for one of the following four operations: encryption, decryption, key wrapping or key unwrapping, depending on the value of opmode.
    If this cipher requires any algorithm parameters that cannot be derived from the given key, the underlying cipher implementation is supposed to generate the required parameters itself (using provider-specific default or random values) [...]
    Da cui desumo che, se non imposto un IV particolare in fase di encrypt, e se non ne uso uno apposito durante il decrypt, se lo genera da solo... e non si richiede, per il decrypt, l'uso dell'IV generato automaticamente in encrypt. Dove sbaglio la mia interpretazione?

    Grazie per il suggerimento del 0x00.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    tu stai usando un algoritmo di cifratura a blocchi (CBC) e questo tra le altre cose chiede l'uso di un IV (fillato ad ogni giro con il result dell'encryption).
    Leggi bene questa frase:


    the underlying cipher implementation is supposed to generate the required parameters itself (using provider-specific default or random values) [...]


    Puoi presumere (traduzione letterale) che l'implementazione che tu becchi per il tuo algoritmo generi i valorii mancanti per te, non è una certezza, soprattutto non hai la certezza di come prendi questi valori, ergo è sempre meglio inizializzare usando un tuo IV. quella di un array di byte 0x00 è un suggerimento, di solito si utilizzano altri valori aumentando il livello di sicurezza, ma non mi cullerei troppo del fatto che l'algoritmo faccia per me i passi mancanti per due motivi:
    1. non sai mai quale implementazione prendi: se hai più provider che forniscono lo stesso servizio, prendi il primo che trovi in lista, i cui default non sempre vanno bene (puoi avere un diverso default dato da un altro provider che per caso in fase di cifratura si trovava avanti a quello che è stato preso in fase di decifratura)
    2. se usi valori random, a meno di portarteli dietro, non è detto che decifri correttamente.

    Per esperienza, è sempre bene:
    1. specificare il provider da usare
    2. specificare tutti i parametri, non cullandosi del fatto che quelli mancanti (e cmq necessari) vengano generati in automatico
    RTFM Read That F*** Manual!!!

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da tenik
    Io il codice lo vedo perfettamente. Se preferisci, te lo metto in un tag quote:
    Penso valia si riferisca al fatto che il codice è tutto su una riga anziché essere formattato e indentato
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Originariamente inviato da Alex'87
    Penso valia si riferisca al fatto che il codice è tutto su una riga anziché essere formattato e indentato
    Esatto.
    E per evitare questi effetti NON si deve utilizzare il pulsante CODE (che serve ad inserire una sola riga di codice), ma si deve scrivere (manualmente) il tag code esplicitamente nell'area del messaggio, quindi incollare il codice, e chiudere (sempre manualmente) il tag, in questo modo:

    [CODE]

    ... incollare il codice ...

    [/CODE]

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    15
    Allora chiedo scusa, errore mio, non lo sapevo.

    Grazie per tutte le indicazioni.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.