Puisque la crypto est un de mes champs de prédilection en ce moment, je me dois d'intervenir, puisqu'il y a incompréhension totale sur le sujet dans ce que je viens de lire (a noter que je parle ici du code, ce que je dis n'est pas à prendre personnellement).
1) Chiffrer un mot de passe ? Heindre ?

ça ne s'enregistre pas un mot de passe, pour aucune raison valable. S'il y en a une, elle est sans doute mauvaise. On enregistre un hash d'un mot de passe, salé qui plus est (c'est à dire, concaténé avec une chaîne aléatoire unique qu'on enregistrera, en clair, avec le mot de passe).
Lire la doc de cette fonction pour bien chiffrer un mot de passe, et s'assurer qu'on dispose de blowfish ou sha-256 ou sha-512:
crypt()
2) md5 ?

Autant enregistrer tout en clair... md5 est considéré brisé. Peut-importe si on le rehache 15 fois. Rien que le fait de l'utiliser prouve que l'auteur des fonctions n'y comprenait pas grand chose: on n'y voit qu'une illusion de sécurité en utilisant AES 256 (très utile si tu protège des données très très confidentielles, la NSA et le NIST le recommandent, du reste c'est overkill) puisque affaiblie par l'utilisation qui en est faite ici (md5, pas d'IV ...). L'encodage en base 64 est très drôle. C'est peut-être une blague en fait

.
On utilisera au moins sha-1, bien que considéré affaibli dans le monde de la crypto, et on sera plus avisé de se porter sur sha-2 (sha-256, 384, 512), qui tient la route pour le moment, en attendant que la compétition sha-3 déclare son vainqueur (je penche pour keccak, mais c'est le seul dont j'ai lu la doc

). Et toujours avec un nonce (sel) bien entendu.
3) l'utilisation d'un algorithme de chiffrage demande, pour obtenir la sécurité qu'il prétend donner, qu'on respecte ses requis et son mode de fonctionnement. La non-utilisation correcte d'un vecteur d'initialisation en est un cas flagrant ici. C'est censé être un sel ( avec une fonction toute faite: mcrypt-create-iv() ), qu'on enregistre en clair avec le chiffre, pas un re-cryptage de la clé.
4) Pour ce qui est du code, je vois mal d'ou vient la variable "$key", la clé qui chiffre les mots de passe. Mais puisque c'est une variable "globale", le pire est a craindre... (il suffirait de s'infiltrer sur le serveur, de lire le bout de code idoine, et hop, on a accès à toutes les données !)
Bref (j'abrège, on m'attend pour le petit-déjeuner), la sécurité, si on souhaite l'offrir, ne se réalise pas en implémentant des choses à gauche à droite. Soit on tente de comprendre ce qui se passe (avec l'état d'esprit paranoiaque qui convient), soit on utilise les procédures conseillées et établies. Pour ce qui est du mot de passe, le hacher avec un algo correct (sha-2) et le saler (utilisation du nonce - Number used ONCE) est une base irréprochable.
ps: je n'ai pas cryptanalysé tout le code, mais puisqu'une chaine de sécurité n'a que la résistance de son maillon le plus faible, ici (sans considérer l'insécurité dans l'architecture et la plate-forme utilisée) md5, qui ne produit qu'un hash de 128 bits. Or comme la résistance d'un hash se calcule en la divisant par deux (principe du birthday attack, voir doc), on n'offre ici qu'une sécurité de 64 bits, des années-lumière à celle prétendue de 256 bits offerte par AES (aka rijndael). De plus, md5 étant brisé, il n'y pas plus aucune sécurité du tout.
