La siguiente es una traduccion de la RFC de el algoritmo de encriptacion CAST. Una RFC es un documento tecnico que da origen o describe un estandar
1. Introducción
Este documento describe el algoritmo de cifrado CAST-128, un DES-como
La sustitución-permutación (SPN) criptosistema que parece
tienen buena resistencia al criptoanálisis diferencial y lineal
criptoanálisis, y el criptoanálisis de clave relacionada. Esta cifra también
posee una serie de otras propiedades criptográficas deseable,
incluyendo avalancha, estricto criterio Avalanche (SAC), el bit
Criterio de la Independencia (BIC), no hay propiedad complementaria, y un
ausencia de claves débiles y semi-débiles. Por tanto, parece ser un buen
candidato para un uso general en toda la comunidad de Internet
siempre que sea un criptográficamente fuerte, cifrado disponibles gratuitamente
algoritmo es necesario.
Adams [Adams] discute el procedimiento de diseño CAST en algunos detalles;
análisis también se pueden obtener en línea (véase, por ejemplo, [web1] o
2. Descripción del algoritmo
CAST-128 pertenece a la clase de algoritmos de cifrado se conoce como
sistemas de cifrado de Feistel; funcionamiento general de aplicación es similar a los Datos
Encryption Standard (DES). El algoritmo de cifrado completo se da en
los siguientes cuatro pasos.
ENTRADA: texto plano … m64 m1; clave K = k1 … k128.
SALIDA: c1 texto cifrado … C64.
1. (Cuadro clave) Calcule 16 pares de subclaves (Kmi, Kri) de K
(Véanse las secciones 2,1 y 2,4).
2. (L0, R0) <- (m1. .. m64). (Dividir el texto en claro a la izquierda y
derecho de 32-bit mitades L0 = m1 … m32 y m33 = R0 … m64.)
3. (16 balas) para i desde 1 hasta 16, calcule Li y Ri sigue como:
Li = Ri-1;
Ri = Li-1 ^ f (Ri-1, Kmi, Kri), donde f se define en la sección 2.2
(F es de Tipo 1, Tipo 2 o Tipo 3, en función de i).
4. c1 … C64 <- (R16, L16). (Cambio de final bloques L16, R16 y
concatenar para formar el texto cifrado.)
El descifrado es idéntico al algoritmo de cifrado anteriormente expuestas,
salvo que en las rondas (y por tanto los pares subclave) se utilizan en
orden inverso para calcular (L0, R0) de (R16, L16).
Véase el Apéndice B de vectores de prueba que se puede utilizar para verificar
corrección de una aplicación de este algoritmo.
2.1. Los pares de claves de la Ronda
CAST-128 utiliza un par de subclaves por vuelta: una cantidad de 32-bit Km es
utilizado como una «ocultación» clave y una cantidad de 5 bits Kr se utiliza como un
«Rotación» clave.
2.2. Rondas no idénticos
Tres funciones diferentes redondas se utilizan en CAST-128. Las rondas son
de la siguiente manera (donde «D» es la entrada de datos a la función f y «I bis» –
«Id» es el byte más significativo a través de byte menos significativo de
I, respectivamente). Tenga en cuenta que «» y «-» son la suma y resta
módulo 2 ** 32, «^» es XOR bit a bit, y es «<<<» la circular de izquierda
turnos.
Tipo 1: I = ((Kmi D) <<<Kri)
f = ((S1 [IA] ^ S2 [Ib]) – S3 [] Ic) S4 [id]
Tipo 2: I = ((Kmi ^ D) <<<Kri)
f = ((S1 [] I bis – S2 [Ib]) S3 [] Ic) ^ S4 [id]
Tipo 3: I = ((Kmi – D) <<<Kri)
f = ((S1 [IA] S2 [Ib]) ^ S3 [] Ic) – S4 [id]
Rondas 1, 4, 7, 10, 13, 16 y utilizar la función f de tipo 1.
Rondas 2, 5, 8, 11 y 14 f utilización función del tipo 2.
Rondas 3, 6, 9, 12 y 15 f utilizar la función de tipo 3.
2.3. Sustitución Cajas
CAST-128 utiliza ocho cajas de sustitución: cajas de s-S1, S2, S3 y S4
son redondos función s-cajas, S5, S6, S7, S8 y son la clave horario de s-
cajas. Aunque 8 s-cajas necesitará un total de 8 kilobytes de almacenamiento,
tenga en cuenta que sólo el 4 KBytes se requieren durante el cifrado real /
descifrado, ya que la generación de subclave se realiza normalmente antes de cualquier
datos de entrada.
Véase el Apéndice A de los contenidos de las cajas s-S1 – S8.
2.4. Fechas clave
Deje que la clave de 128-bit se x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF, donde x0
representa el byte más significativo y representa menos xF
byte significativo.
Que z0 .. zF ser intermedias (temporal) bytes.
Que Si [] representan s i-box y dejar que «^» representa además XOR.
Las subclaves se forman a partir de la clave x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF
de la siguiente manera.
z0z1z2z3 = ^ x0x1x2x3 S5 [xD] ^ S6 [xF] ^ S7 [xC] ^ S8 [Xe] ^ S7 [x8]
z4z5z6z7 = ^ x8x9xAxB S5 [z0] ^ S6 [z2] ^ S7 [z1] ^ S8 [z3] ^ S8 [xA]
z8z9zAzB = ^ xCxDxExF S5 [Z7] ^ S6 [z6] ^ S7 [z5] ^ S8 [z4] ^ S5 [x9]
zCzDzEzF = ^ x4x5x6x7 S5 [es] ^ S6 [z9] ^ S7 [zB] ^ S8 [Z8] ^ S6 [xB]
K1 = S5 [Z8] ^ S6 [z9] ^ S7 [Z7] ^ S8 [z6] ^ S5 [z2]
K2 = zA S5 [] ^ S6 [zB] ^ S7 [z5] ^ S8 [z4] ^ S6 [z6]
K3 = S5 [ZC] ^ S6 [zd] ^ S7 [z3] ^ S8 [z2] ^ S7 [z9]
K4 = S5 ze [] ^ S6 [zF] ^ S7 [z1] ^ S8 [z0] ^ S8 [] ZC
x0x1x2x3 = ^ z8z9zAzB S5 [z5] ^ S6 [Z7] ^ S7 [z4] ^ S8 [z6] ^ S7 [z0]
x4x5x6x7 = ^ z0z1z2z3 S5 [x0] ^ S6 [x2] ^ S7 [x1] ^ S8 [x3] ^ S8 [z2]
x8x9xAxB = ^ z4z5z6z7 S5 [x7] ^ S6 [x6] ^ S7 [x5] ^ S8 [x4] ^ S5 [z1]
xCxDxExF = ^ zCzDzEzF S5 [xA] ^ S6 [x9] ^ S7 [xB] ^ S8 [x8] ^ S6 [z3]
K5 = S5 [x3] ^ S6 [x2] ^ S7 [] xC ^ S8 [xD] ^ S5 [x8]
K6 = S5 [x1] ^ S6 [x0] ^ S7 [Xe] ^ S8 [xF] ^ S6 [xD]
K7 = S5 [x7] ^ S6 [x6] ^ S7 [x8] ^ S8 [x9] ^ S7 [x3]
K8 = S5 [x5] ^ S6 [x4] ^ S7 [xA] ^ S8 [xB] ^ S8 [x7]
z0z1z2z3 = ^ x0x1x2x3 S5 [xD] ^ S6 [xF] ^ S7 [xC] ^ S8 [Xe] ^ S7 [x8]
z4z5z6z7 = ^ x8x9xAxB S5 [z0] ^ S6 [z2] ^ S7 [z1] ^ S8 [z3] ^ S8 [xA]
z8z9zAzB = ^ xCxDxExF S5 [Z7] ^ S6 [z6] ^ S7 [z5] ^ S8 [z4] ^ S5 [x9]
zCzDzEzF = ^ x4x5x6x7 S5 [es] ^ S6 [z9] ^ S7 [zB] ^ S8 [Z8] ^ S6 [xB]
K9 = S5 [z3] ^ S6 [z2] ^ S7 [] ZC ^ S8 [zd] ^ S5 [z9]
K10 = S5 [z1] ^ S6 [z0] ^ S7 [ZE] ^ S8 [zF] ^ S6 [] ZC
K11 = S5 [Z7] ^ S6 [z6] ^ S7 [Z8] ^ S8 [z9] ^ S7 [z2]
K12 = S5 [z5] ^ S6 [z4] ^ S7 [es] ^ S8 [zB] ^ S8 [z6]
x0x1x2x3 = ^ z8z9zAzB S5 [z5] ^ S6 [Z7] ^ S7 [z4] ^ S8 [z6] ^ S7 [z0]
x4x5x6x7 = ^ z0z1z2z3 S5 [x0] ^ S6 [x2] ^ S7 [x1] ^ S8 [x3] ^ S8 [z2]
x8x9xAxB = ^ z4z5z6z7 S5 [x7] ^ S6 [x6] ^ S7 [x5] ^ S8 [x4] ^ S5 [z1]
xCxDxExF = ^ zCzDzEzF S5 [xA] ^ S6 [x9] ^ S7 [xB] ^ S8 [x8] ^ S6 [z3]
K13 = S5 [x8] ^ S6 [x9] ^ S7 [x7] ^ S8 [x6] ^ S5 [x3]
K14 = S5 xA [] ^ S6 [xB] ^ S7 [x5] ^ S8 [x4] ^ S6 [x7]
K15 = S5 [xC] ^ S6 [xD] ^ S7 [x3] ^ S8 [x2] ^ S7 [x8]
K16 = S5 xE [] ^ S6 [xF] ^ S7 [x1] ^ S8 [x0] ^ S8 [xD]
[La otra mitad es idéntica a lo que se da lo anterior, el ejercicio de
de los últimos creado x0 .. xF para generar claves K17 – K32.]
z0z1z2z3 = ^ x0x1x2x3 S5 [xD] ^ S6 [xF] ^ S7 [xC] ^ S8 [Xe] ^ S7 [x8]
z4z5z6z7 = ^ x8x9xAxB S5 [z0] ^ S6 [z2] ^ S7 [z1] ^ S8 [z3] ^ S8 [xA]
z8z9zAzB = ^ xCxDxExF S5 [Z7] ^ S6 [z6] ^ S7 [z5] ^ S8 [z4] ^ S5 [x9]
zCzDzEzF = ^ x4x5x6x7 S5 [es] ^ S6 [z9] ^ S7 [zB] ^ S8 [Z8] ^ S6 [xB]
K17 = S5 [Z8] ^ S6 [z9] ^ S7 [Z7] ^ S8 [z6] ^ S5 [z2]
K18 = zA S5 [] ^ S6 [zB] ^ S7 [z5] ^ S8 [z4] ^ S6 [z6]
K19 = S5 [ZC] ^ S6 [zd] ^ S7 [z3] ^ S8 [z2] ^ S7 [z9]
K20 = S5 ze [] ^ S6 [zF] ^ S7 [z1] ^ S8 [z0] ^ S8 [] ZC
x0x1x2x3 = ^ z8z9zAzB S5 [z5] ^ S6 [Z7] ^ S7 [z4] ^ S8 [z6] ^ S7 [z0]
x4x5x6x7 = ^ z0z1z2z3 S5 [x0] ^ S6 [x2] ^ S7 [x1] ^ S8 [x3] ^ S8 [z2]
x8x9xAxB = ^ z4z5z6z7 S5 [x7] ^ S6 [x6] ^ S7 [x5] ^ S8 [x4] ^ S5 [z1]
xCxDxExF = ^ zCzDzEzF S5 [xA] ^ S6 [x9] ^ S7 [xB] ^ S8 [x8] ^ S6 [z3]
K21 = S5 [x3] ^ S6 [x2] ^ S7] [xC ^ S8 [xD] ^ S5 [x8]
K22 = S5 [x1] ^ S6 [x0] ^ S7 [Xe] ^ S8 [xF] ^ S6 [xD]
K23 = S5 [x7] ^ S6 [x6] ^ S7 [x8] ^ S8 [x9] ^ S7 [x3]
K24 = S5 [x5] ^ S6 [x4] ^ S7 [xA] ^ S8 [xB] ^ S8 [x7]
z0z1z2z3 = ^ x0x1x2x3 S5 [xD] ^ S6 [xF] ^ S7 [xC] ^ S8 [Xe] ^ S7 [x8]
z4z5z6z7 = ^ x8x9xAxB S5 [z0] ^ S6 [z2] ^ S7 [z1] ^ S8 [z3] ^ S8 [xA]
z8z9zAzB = ^ xCxDxExF S5 [Z7] ^ S6 [z6] ^ S7 [z5] ^ S8 [z4] ^ S5 [x9]
zCzDzEzF = ^ x4x5x6x7 S5 [es] ^ S6 [z9] ^ S7 [zB] ^ S8 [Z8] ^ S6 [xB]
K25 = S5 [z3] ^ S6 [z2] ^ S7 [] ZC ^ S8 [zd] ^ S5 [z9]
K26 = S5 [z1] ^ S6 [z0] ^ S7 [ZE] ^ S8 [zF] ^ S6 [] ZC
K27 = S5 [Z7] ^ S6 [z6] ^ S7 [Z8] ^ S8 [z9] ^ S7 [z2]
K28 = S5 [z5] ^ S6 [z4] ^ S7 [es] ^ S8 [zB] ^ S8 [z6]
x0x1x2x3 = ^ z8z9zAzB S5 [z5] ^ S6 [Z7] ^ S7 [z4] ^ S8 [z6] ^ S7 [z0]
x4x5x6x7 = ^ z0z1z2z3 S5 [x0] ^ S6 [x2] ^ S7 [x1] ^ S8 [x3] ^ S8 [Z2]
x8x9xAxB = ^ z4z5z6z7 S5 [x7] ^ S6 [x6] ^ S7 [x5] ^ S8 [x4] ^ S5 [z1]
xCxDxExF = ^ zCzDzEzF S5 [xA] ^ S6 [x9] ^ S7 [xB] ^ S8 [x8] ^ S6 [z3]
K29 = S5 [x8] ^ S6 [x9] ^ S7 [x7] ^ S8 [x6] ^ S5 [x3]
K30 = xA S5] [^ S6 [xB] ^ S7 [x5] ^ S8 [x4] ^ S6 [x7]
K31 = S5 [xC] ^ S6 [xD] ^ S7 [x3] ^ S8 [x2] ^ S7 [x8]
K32 = S5 xE [] ^ S6 [xF] ^ S7 [x1] ^ S8 [x0] ^ S8 [xD]
2.4.1. Subclaves de ocultación y Girar subclaves
Que KM1, …, Km16 se subclaves enmascaramiento de 32-bit (uno por vuelta).
Que KR1,, productos KR16 ser de 32-bit girar subclaves (uno por vuelta), y sólo el
menos significativo 5 bits son utilizados en cada ronda.
for (i = 1; i <= 16; i) (Kmi = Ki; Kri = K16 i;)
2.5. Variable tamaño de clave
El algoritmo de cifrado CAST-128 ha sido diseñado para permitir una clave
tamaño que puede variar de 40 bits a 128 bits, en incrementos de 8-bits
(Es decir, los tamaños de clave permitidos son de 40, 48, 56, 64, …, 112, 120,
y 128 bits. Para el funcionamiento tamaño de clave variable, el pliego de condiciones
de la siguiente manera:
1) Para los tamaños de clave de hasta e incluyendo 80 bits (es decir, 40, 48, 56, 64,
72, y los bits 80), el algoritmo es exactamente como se especifica pero utiliza
12 rondas en lugar de 16;
2) Para los tamaños de clave superior a 80 bits, el algoritmo utiliza el total de 16
rondas;
3) Para los tamaños de clave menos de 128 bits, la clave se rellena con cero
bytes (en el extremo derecho, o al menos importantes, las posiciones) a
128 bits (ya que el horario clave CAST-128 supone una clave de entrada de
128 bits).
Tenga en cuenta que a pesar de CAST-128 puede soportar los 12 tamaños de clave que figuran
anterior, 40 bits, 64 bits, los bits de 80, y 128 bits son los tamaños
encontrar utilidad en ambientes típicos. Por lo tanto, es probable que se
suficiente para la mayoría de implementaciones para apoyar un subconjunto de sólo
estos cuatro tamaños.
Con el fin de evitar la confusión cuando la operación tamaño de clave variable se utiliza,
el nombre CAST-128 se considera sinónimo de la CAST5 nombre;
esto permite un tamaño de clave que se adjunta de forma inequívoca. Así, para
ejemplo, CAST-128 con una clave de 40-bit se denomina CAST5-40;
Cuando una clave de 128-bit está explícitamente previsto, el nombre CAST5-128 debe
ser utilizado.
2.6. CAST5 identificadores de objetos
Para aquellos que puedan estar usando el algoritmo CAST en la negociación dentro de un
Protocolo, o en cualquier otro contexto que puede requerir el uso del objeto
Identificadores, la OID han definido las siguientes.
algoritmos OBJECT IDENTIFIER:: =
(Iso (1) memberBody (2) EE.UU. (840) nt (113.533) nsn (7) algoritmos (66))
cast5CBC OBJECT IDENTIFIER:: = (algoritmos cast5CBC (10))
Parámetros:: = SEQUENCE (
iv OCTET STRING DEFAULT 0, – vector de inicialización
KeyLength ENTERO – Longitud de la clave, en bits
)
Nota: El IV es opcional y por defecto a todos de cero. En la codificación
final, si uno iv todas cero es usado, entonces debería de ausencia del
los parámetros. En el extremo de decodificación, un iv ausentes deben ser
interpretarse en el sentido de todos los ceros.
Este es el cifrado y descifrado en modo CBC con el CAST-128
bloque de algoritmo de cifrado simétrico.
cast5MAC OBJECT IDENTIFIER:: = (algoritmos cast5MAC (11))
Parámetros:: = SEQUENCE (
ENTERO macLength, – longitud del MAC, en bits
KeyLength ENTERO – Longitud de la clave, en bits
)
Esta es la autenticación de mensajes mediante el CAST-128 bloques simétricos
algoritmo de cifrado.
pbeWithMD5AndCast5CBC OBJECT IDENTIFIER:: =
(Algoritmos pbeWithMD5AndCAST5-CBC (12))
Parámetros:: = SEQUENCE (
sal OCTET STRING,
ENTERO iterationCount, – número total de iteraciones hash
KeyLength ENTERO – Longitud de la clave, en bits
)
Nota: El IV se deriva del procedimiento de dispersión y por lo tanto
No es necesario incluir en los parámetros.