2017-02-13 2 views
2

Mon code fonctionne si je tapote manuellement ma chaîne à la longueur de 32.
Ma question est la suivante: Y a-t-il un moyen de rendre le pavé openSSL les données, ou dois-je toujours le faire pour cela?Comment est-ce que openssl_encrypt remplit l'entrée à la taille de bloc requise?

travail:

openssl_encrypt ("my baba is over the ocean1111111", 'AES-256-CBC', $MY_SECRET_KEY,OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,$MY_IV); 

ne fonctionne pas:

openssl_encrypt ("my baba is over the ocean", 'AES-256-CBC', $MY_SECRET_KEY,OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,$MY_IV); 

Je résous ce moment par l'auto padding:

$pad = 32 - (strlen("my baba is over the ocean") % 32); 
$clear = "my baba is over the ocean" . str_repeat(chr($pad), $pad); //encrypt this string 
+1

La taille du bloc est requis pour AES 16. Je devine que votre choix de rembourrage de 0 est confondant la machine. – jww

+1

Ne pouvez-vous pas utiliser intentionnellement PKCS5 comme système de remplissage à la place de l'endroit où vous avez actuellement un remplissage nul? –

+0

@LukePark est-il un moyen intégré de le faire? btw -> remarque je pad le bloc moi-même et pas avec des zéros –

Répondre

2

Comme Luc dit Park, au lieu de dire explicitement openssl_encrypt à utiliser OPENSSL_ZERO_PADDING, supprimez simplement cette option du paramètre et il sera aller au PKCS #7 padding scheme (remplit le reste du bloc avec 0x0nn est le nombre d'octets nécessaire; + 16 0x00 si le bloc est déjà terminé). Note: PKCS # 5 tel que référencé par Luke et PKCS # 7 sont effectivement identiques dans ce scénario.

De PHP docs:

Sans utiliser OPENSSL_ZERO_PADDING, vous obtiendrez automatiquement PKCS # 7 rembourrage.

Vous devriez appeler:

openssl_encrypt("my baba is over the ocean", 'AES-256-CBC', $MY_SECRET_KEY, OPENSSL_RAW_DATA, $MY_IV); 
+2

Ce qui m'a confondu était le nom, j'ai supposé que cela signifie remplissage avec ZÉROS. alors qu'en vérité, cela signifiait PAS DE PADDING. –