Cómo utilizar javascript para implementar el cifrado y descifrado rsa
El principio es el siguiente:
1. El servidor genera la clave pública y la clave privada y las guarda.
2. El cliente genera una cadena aleatoria después de solicitar la página de inicio de sesión.
3. Utilice la cadena aleatoria como clave para cifrar la contraseña y luego utilice la clave pública obtenida del servidor para cifrar la cadena aleatoria generada.
4. Pase los dos textos cifrados al servidor, el servidor usa su clave privada para descifrar la cadena aleatoria y luego usa la clave privada para descifrar el texto cifrado.
También hay una clave que descifra la clave pública del lado del servidor. Una vez pasada al cliente, el cliente utiliza la clave pública para cifrar la cadena, que luego se puede descifrar en el lado del servidor. con la clave privada.
Este artículo es para lograr este paso.
El algoritmo de cifrado es RSA:
1. ¿Implementación Java del lado del servidor? /**? *? */?
paquete?com.sunsoft.struts.util;?
importar?java.io.ByteArrayOutputStream;?
¿importar?java.io.FileInputStream;?
importar?java.io.FileOutputStream;?
importar?java.io.ObjectInputStream;?
¿importar? java.io.ObjectOutputStream;?
importar?java.math.BigInteger;?
importar?java.security.KeyFactory;?
importar?java. seguridad.KeyPair;?
importar?java.security.KeyPairGenerator;?
importar?java.security.NoSuchAlgorithmException;?
importar?java.security. PrivateKey;?
importar?java.security.PublicKey;?
importar?java.security.SecureRandom;?
importar?java.security.interfaces. RSAPrivateKey;?
importar?java.security.interfaces.RSAPublicKey;?
importar?java.security.spec.InvalidKeySpecException;?
importar?java. security.spec.RSAPrivateKeySpec;?
importar?java.security.spec.RSAPublicKeySpec;?
importar?javax.crypto.Cipher;? *? *?Clase de utilidad RSA. Proporciona métodos para cifrar, descifrar y generar pares de claves. *?Debe visitar http://www.bouncycastle.org para descargar bcprov-jdk14-123.jar.
*? */?
¿público? *?
¿público?class?RSAUtil?{? ¿Generar par de claves?
¿Clase pública?RSAUtil?*?*?*?*?
¿Estática pública?
nuevo?org.bouncycastle.jce.provider. BouncyCastleProvider());?
¿final? ¿Este valor está relacionado con el tamaño del cifrado del bloque y se puede cambiar, pero no puede ser demasiado grande, de lo contrario la eficiencia será muy baja?
keyPairGen.initialize(KEY_SIZE,?new?SecureRandom());?
keyPair?
saveKeyPair(keyPair);?
¿regresar?
}?{
¿Lanzar?
¿lanzar nueva excepción (e.getMessage());?
}?
}?
¿Estático público?(KeyPair)?oos.readObject();? );? fis.close();? return?kp;?
}?
public?static?void?saveKeyPair(KeyPair?kp)throws?Excepción{? fos?=?new?FileOutputStream("C:/RSAKey.txt");? ObjectOutputStream? // ¿Generar clave? oos.writeObject(kp);? oos.close();? fos.close();?
}?
/**? *?*?Generar clave pública
Generar clave pública.
*? *?@param?modulus?*? *?@param?publicExponent?*? *?@return?RSAPublicKey?*? *? throws?Exception?{?
KeyFactory?keyFac?=?
intenta{?
p>
keyFac?=?KeyFactory.getInstance(" RSA",?);?
new?org.bouncycastle.jce.provider.BouncyCastleProvider());?
}?catch?{
lanzar nueva excepción (ex.getMessage());?
}?
RSAPublicKeySpec?pubKeySpec?=?new?RSAPublicKeySpec (nuevo?BigInteger(?));?
módulo),?new?BigInteger(publicExponent));?
intenta{?
return(RSAPublicKey )?
}?catch?{
lanzar nueva excepción (ex.getMessage());?
}?
}
/** *?
/**?¿Generar clave privada?
Generar clave privada.
*? *?@param?modulus?*? *?@param?privateExponent?*? *?@return?RSAPrivateKey?*? ]?modulus,? throws?Exception?{?
KeyFactory?keyFac?=?
intenta{?
p>
keyFac?=?KeyFactory.getInstance(" RSA",?);?
new?org.bouncycastle.jce.provider.BouncyCastleProvider());?
}?catch?{
lanzar nueva excepción (ex.getMessage());?
}?
RSAPrivateKeySpec?priKeySpec?=?new?RSAPrivateKeySpec (new?BigInteger(?));?
módulo),?new?BigInteger(privateExponent));?
intenta{?
return(RSAPrivateKey )?
}?catch?{
lanzar nueva excepción (ex.getMessage());?
}?
}
/** *?
}?
/**?¿Cifrado?
Cifrado. *? *? *¿Clave de cifrado? *? *?@param?data? *¿Datos de texto sin formato que se cifrarán? *? *?@return ¿Datos cifrados? *? *?@throws?
byte estático público[]?
new?org.bouncycastle.jce.provider.BouncyCastleProvider());?
cipher.init(Cipher.ENCRYPT_MODE,?pk);?
int?blockSize?=?cipher.getBlockSize();//?Obtenga el tamaño del bloque cifrado, por ejemplo, los datos antes del cifrado es una sección de 128 palabras, key_size = 1024; los datos cifrados son 128 bytes, key_size = 127, por lo tanto *** hay 2 bloques cifrados, el primero es de 127 bytes y el segundo es de 1 byte.
¿Obtener el tamaño del bloque cifrado después del cifrado?
int?
int?blocksSize?=?leavedSize =?0data.length?/?blockSize?+?1?
byte[]?
int?
mientras (data.length - i * blockSize >?0)?{
if(data.length?-?i?*?blockSize ?>?blockSize)?
cipher.doFinal(data,?i?*?blockSize,?blockSize,?raw,?i?
*?outputSize);? p>
else?
cipher.doFinal(datos,?i?*?blockSize,?data.length?-?i?
*?blockSize,?raw, ?i?*?outputSize);?
/?No hay ningún método doUpdate aquí. Al observar el código fuente, puede encontrar que después de cada doUpdate, además de colocar el byte [] en?
/? ByteArrayOutputStream, finalmente ejecute doFinal. En este momento, todos los bytes [] se cifrarán, pero es probable que el tamaño del bloque cifrado haya excedido?
/?OutputSize, por lo que debemos Utilice el método dofinal.
i++;?
}?
¿regresar?
}?{
¿Lanzar?
lanzar nueva excepción (e.getMessage());?
}?
}
/** *? >
}
/**?¿Descifrar?
¿Descifrar? *? *? *¿Clave de descifrado? *? *?@param?raw? *¿Datos cifrados? *? *?@return? *? *? */?
público?
nuevo?org.bouncycastle.jce.provider.BouncyCastleProvider());?
cipher.init(cipher.DECRYPT_MODE,?pk);?
int?blockSize?=?cipher.getBlockSize();?
ByteArrayOutputStream?bout?=?new ?ByteArrayOutputStream(64);?
int?
mientras(raw.length - j * blockSize >?0)?{
bout.write(cipher) .doFinal(raw,?j?*?blockSize,?blockSize));?
j++;?
}?
regresar?
}?{
¿Lanzar?
¿lanzar?nueva?Excepción(e.getMessage());?
}?
}?
/**? *?
}? *? *? RSAUtil.generateKeyPair().getPublic();?
String?test?=?" hola?mundo";?
byte[]?en_test?=?encrypt(getKeyPair( ).getPublic(),test.getBytes());?
byte[]?de_test?=?decrypt(getKeyPair().getPrivate(),en_test);?
System.out.println(new?String(de_test));?
}?
}?2. Página de prueba:
IndexAction.java p>