Los algoritmos simétricos no pueden dar la propiedad de no repudio que otorgan los esquemas de firmas asimétricos, es decir, el receptor de un mensaje no puede probar que no creó el mensaje, ya que deben conocer el esquema.
Dicho esto, un message authentication code (MAC) puede darle lo que quiere: Tanto el emisor como el receptor tienen una clave compartida, el emisor calcula un MAC con el secreto y lo anexa al mensaje, y el receptor calcula la mismo MAC y lo compara con el mensaje recibido.
Mientras que el tipo MAC más a menudo utilizado (HMAC) se basa en las funciones de hash, también son los que se basan en un cifrado en bloque como AES, como CBC-MAC (esto es como CBC, pero con vector cero de inicialización y utilizando sólo el último bloque como salida). (Como dice noloader, CBC-MAC no es la forma más segura de hacerlo, use otros modos).
Debe usar la autenticación de mensajes en la mayoría de los casos en que usa encriptación, ya que muchos esquemas de cifrado son vulnerables a los elegidos- ataques de texto claro.
En Java, se puede calcular (y verificar) un MAC utilizando la clase javax.crypto.Mac.
CBC-MAC está roto para mensajes de longitud variable. Un CMAC es un CBC-MAC hecho bien. – jww
Lo siento, pero todavía no estoy seguro. ¿Qué determina el tamaño de la clave que se utilizará para HMAC? Entiendo que puedo usar HMAC sobre CMAC. Pero la clave que tengo es aes 128. ¿Se puede usar eso? por ejemplo: clave SecretKey = nueva clave secreta (clave, "AES") – user839917
Preferiblemente, debe usar una clave diferente (independiente) para MAC y cifrado, aunque HMAC es bastante diferente, por lo que usar la misma clave no dará problemas. Puede usar cualquier longitud de clave que desee para HMAC (hasta la longitud del bloque de funciones hash) (aunque no sé si su implementación lo admite), simplemente se rellenará con cero hasta la longitud del bloque de su función hash. Las teclas más grandes brindan más seguridad, aunque no se obtendrá mejor que el tamaño de salida de las funciones hash (= tamaño MAC). –