Top Description Fields Constructors Methods
org.bouncycastle.crypto.engines

public Class SM4Engine

extends Object
implements BlockCipher
Class Inheritance
All Implemented Interfaces
org.bouncycastle.crypto.BlockCipher
Imports
org.bouncycastle.crypto.BlockCipher, .CipherParameters, .CryptoServicesRegistrar, .DataLengthException, .OutputLengthException, org.bouncycastle.crypto.constraints.DefaultServiceProperties, org.bouncycastle.crypto.params.KeyParameter, org.bouncycastle.util.Pack

SM4 Block Cipher - SM4 is a 128 bit block cipher with a 128 bit key.

The implementation here is based on the document https://eprint.iacr.org/2008/329.pdf by Whitfield Diffie and George Ledin, which is a translation of Prof. LU Shu-wang's original standard.

Field Summary

Modifier and TypeField and Description
private static final int
private static final int[]
private static final int[]
private int[]
private static final byte[]
private final int[]
X

Constructor Summary

AccessConstructor and Description
public

Method Summary

Modifier and TypeMethod and Description
private int[]
expandKey(boolean forEncryption, byte[] key)

private int
F0(int[] X, int rk)

private int
F1(int[] X, int rk)

private int
F2(int[] X, int rk)

private int
F3(int[] X, int rk)

public String
getAlgorithmName()

Implements org.bouncycastle.crypto.BlockCipher.getAlgorithmName.

Return the name of the algorithm the cipher implements.
public int
getBlockSize()

Implements org.bouncycastle.crypto.BlockCipher.getBlockSize.

Return the block size for this cipher (in bytes).
public void
init(boolean
if true the cipher is initialised for encryption, if false for decryption.
forEncryption
,
CipherParameters
the key and other data required by the cipher.
params
)

Implements org.bouncycastle.crypto.BlockCipher.init.

Initialise the cipher.
private int
L(int B)

private int
L_ap(int B)

public int
processBlock(byte[]
the array containing the input data.
in
,
int
offset into the in array the data starts at.
inOff
,
byte[]
the array the output data will be copied into.
out
,
int
the offset into the out array the output will start at.
outOff
)

Implements org.bouncycastle.crypto.BlockCipher.processBlock.

Process one block of input from the array in and write it to the out array.
public void
reset()

Implements org.bouncycastle.crypto.BlockCipher.reset.

Reset the cipher.
private int
rotateLeft(int x, int bits)

private int
T(int Z)

private int
T_ap(int Z)

private int
tau(int A)

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

BLOCK_SIZEback to summary
private static final int BLOCK_SIZE
CKback to summary
private static final int[] CK
FKback to summary
private static final int[] FK
rkback to summary
private int[] rk
Sboxback to summary
private static final byte[] Sbox
Xback to summary
private final int[] X

Constructor Detail

SM4Engineback to summary
public SM4Engine()

Method Detail

expandKeyback to summary
private int[] expandKey(boolean forEncryption, byte[] key)
F0back to summary
private int F0(int[] X, int rk)
F1back to summary
private int F1(int[] X, int rk)
F2back to summary
private int F2(int[] X, int rk)
F3back to summary
private int F3(int[] X, int rk)
getAlgorithmNameback to summary
public String getAlgorithmName()

Implements org.bouncycastle.crypto.BlockCipher.getAlgorithmName.

Doc from org.bouncycastle.crypto.BlockCipher.getAlgorithmName.

Return the name of the algorithm the cipher implements.

Returns:String

the name of the algorithm the cipher implements.

getBlockSizeback to summary
public int getBlockSize()

Implements org.bouncycastle.crypto.BlockCipher.getBlockSize.

Doc from org.bouncycastle.crypto.BlockCipher.getBlockSize.

Return the block size for this cipher (in bytes).

Returns:int

the block size for this cipher in bytes.

initback to summary
public void init(boolean forEncryption, CipherParameters params) throws IllegalArgumentException

Implements org.bouncycastle.crypto.BlockCipher.init.

Doc from org.bouncycastle.crypto.BlockCipher.init.

Initialise the cipher.

Parameters
forEncryption:boolean

if true the cipher is initialised for encryption, if false for decryption.

params:CipherParameters

the key and other data required by the cipher.

Exceptions
IllegalArgumentException:
if the params argument is inappropriate.
Lback to summary
private int L(int B)
L_apback to summary
private int L_ap(int B)
processBlockback to summary
public int processBlock(byte[] in, int inOff, byte[] out, int outOff) throws DataLengthException, IllegalStateException

Implements org.bouncycastle.crypto.BlockCipher.processBlock.

Doc from org.bouncycastle.crypto.BlockCipher.processBlock.

Process one block of input from the array in and write it to the out array.

Parameters
in:byte[]

the array containing the input data.

inOff:int

offset into the in array the data starts at.

out:byte[]

the array the output data will be copied into.

outOff:int

the offset into the out array the output will start at.

Returns:int

the number of bytes processed and produced.

Exceptions
DataLengthException:
if there isn't enough data in input , or space in out.
IllegalStateException:
if the cipher isn't initialised.
resetback to summary
public void reset()

Implements org.bouncycastle.crypto.BlockCipher.reset.

Doc from org.bouncycastle.crypto.BlockCipher.reset.

Reset the cipher. After resetting the cipher is in the same state as it was after the last init (if there was one).

rotateLeftback to summary
private int rotateLeft(int x, int bits)
Tback to summary
private int T(int Z)
T_apback to summary
private int T_ap(int Z)
tauback to summary
private int tau(int A)