Hola!
No he encontrado que hiciera (yo) ninguna función así en PHP... así que te paso el src del programa que hice hace ya 4 años con C (no te será dificil ni optimizarlo ni pasarlo a PHP...). Este mismo podrías compilarlo e incluso llamar al exe desde PHP...
Código C:
Ver original#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main (void)
{
char abecedario[27] = {"ABCÇDEFGHIJKLMNOPQRSTUVWXYZ"};
char pass[100];
char cifrar[100];
int opcion, indexAbc, indexPass, indexCifrar, valorLetra, valorAux, posicionValores1, posicionValores2, largoPass2;
int valoresCifrar[100], valoresPass[100], valoresTrans[100];
int largoCifrar, largoPass, aviso, rep, deMas, subTot, aux, aux2, punto, aux3;
int totales[100],indexTotales,valor,total;
abecedario[3]=128;
valorLetra = 0;
posicionValores1 = 0;
aviso = 0;
posicionValores2 = 0;
valorAux = 0;
indexTotales = 0;
printf("Elige una opcion:\n1. Cifrar\n2. Descifrar\n\n");
while((opcion!=1)&&(opcion!=2)){
if(opcion!=1){
printf("Numero incorrecto... Elige una opcion\n1. Cifrar\n2. Descifrar\n\n"); }else if(opcion!=2){
printf("Numero incorrecto... Elige una opcion\n1. Cifrar\n2. Descifrar\n\n"); }
}
if(opcion==1){
printf("\nEscribe el texto a cifrar: ");
if(largoCifrar>largoPass){
rep=largoCifrar/largoPass;
subTot=largoPass*rep;
deMas=largoCifrar%largoPass;
largoPass2=subTot+deMas;
}else if(largoCifrar<largoPass){
largoPass2=largoCifrar;
}else if(largoCifrar==largoPass){
largoPass2=largoPass;
}
for(indexCifrar=0;indexCifrar<largoCifrar;indexCifrar++){
valorLetra=0;
aviso=0;
indexAbc=0;
while(indexAbc<27&&(aviso==0)){
if(abecedario[indexAbc]==cifrar[indexCifrar]){
valoresCifrar[posicionValores1]=indexAbc;
aviso=1;
}
indexAbc++;
}
posicionValores1++;
}
aviso=0;
for(indexPass=0;indexPass<largoPass2;indexPass++){
valorAux=0;
aviso=0;
indexAbc=0;
while((indexAbc<27)&&(aviso==0)){
if(abecedario[indexAbc]==pass[indexPass]){
valoresPass[posicionValores2]=indexAbc;
aviso=1;
}
indexAbc++;
}
posicionValores2++;
}
punto=posicionValores2-largoPass;
for(aux=0;aux<largoPass;aux++){
valoresTrans[aux]=valoresPass[aux];
}
aux2=0;
aux=largoPass;
aux3=0;
for(aux2=0;aux2<punto;aux2++){
valoresPass[aux]=valoresTrans[aux3];
if(aux3==largoPass-1){
aux3=-1;
}
aux3++;
aux++;
}
for(indexPass=0;indexPass<largoCifrar;indexPass++){
totales[indexTotales]=(valoresCifrar[indexPass]+valoresPass[indexPass])%27;
printf("%c",abecedario
[totales
[indexTotales
]]); indexTotales++;
}
}
else if(opcion==2){
printf("\nEscribe el texto cifrado: "); printf("\nEscribe la contrasenya: ");
if(largoCifrar>largoPass){
rep=largoCifrar/largoPass;
subTot=largoPass*rep;
deMas=largoCifrar%largoPass;
largoPass2=subTot+deMas;
}else if(largoCifrar<largoPass){
largoPass2=largoCifrar;
}
else if(largoCifrar==largoPass){
largoPass2=largoPass;
}
for(indexCifrar=0;indexCifrar<largoCifrar;indexCifrar++){
valorLetra=0;
aviso=0;
indexAbc=0;
while(indexAbc<27&&(aviso==0)){
if(abecedario[indexAbc]==cifrar[indexCifrar]){
valoresCifrar[posicionValores1]=indexAbc;
aviso=1;
}
indexAbc++;
}
posicionValores1++;
}
aviso=0;
for(indexPass=0;indexPass<largoPass2;indexPass++){
valorAux=0;
aviso=0;
indexAbc=0;
while((indexAbc<27)&&(aviso==0)){
if(abecedario[indexAbc]==pass[indexPass]){
valoresPass[posicionValores2]=indexAbc;
aviso=1;
}
indexAbc++;
}
posicionValores2++;
}
punto=posicionValores2-largoPass;
for(aux=0;aux<largoPass;aux++){
valoresTrans[aux]=valoresPass[aux];
}
aux2=0;
aux=largoPass;
aux3=0;
for(aux2=0;aux2<punto;aux2++){
valoresPass[aux]=valoresTrans[aux3];
if(aux3==largoPass-1){
aux3=-1;
}
aux3++;
aux++;
}
for(indexPass=0;indexPass<largoCifrar;indexPass++){
totales[indexTotales]=(valoresCifrar[indexPass]-valoresPass[indexPass]);
if((valoresCifrar[indexPass]-valoresPass[indexPass])<0){
total=((valoresPass[indexPass]-valoresCifrar[indexPass])+27)%27;
totales[indexTotales]=27-total;
}
printf("%c",abecedario
[totales
[indexTotales
]]); indexTotales++;
}
}
printf("\(C) Powered by DoH"); return 1;
}
Solo decir que de esta práctica saqué un 8 (en primero de CFGS de Desarrollo de Aplicaciones Informáticas)
He tenido que borrar los comentarios del código porque sino no cabía en el mensaje... pero bueno, creo que se puede entender bien!
Saludos!