| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- package com.security.cipher.sm;
- import java.math.BigInteger;
- import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
- import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
- import org.bouncycastle.crypto.params.ECPublicKeyParameters;
- import org.bouncycastle.math.ec.ECPoint;
- public class Cipher
- {
- private int ct;
- private ECPoint p2;
- private SM3Digest sm3keybase;
- private SM3Digest sm3c3;
- private byte key[];
- private byte keyOff;
- public Cipher()
- {
- this.ct = 1;
- this.key = new byte[32];
- this.keyOff = 0;
- }
- private void Reset()
- {
- this.sm3keybase = new SM3Digest();
- this.sm3c3 = new SM3Digest();
-
- byte p[] = Util.byteConvert32Bytes(p2.getX().toBigInteger());
- this.sm3keybase.update(p, 0, p.length);
- this.sm3c3.update(p, 0, p.length);
-
- p = Util.byteConvert32Bytes(p2.getY().toBigInteger());
- this.sm3keybase.update(p, 0, p.length);
- this.ct = 1;
- NextKey();
- }
- private void NextKey()
- {
- SM3Digest sm3keycur = new SM3Digest(this.sm3keybase);
- sm3keycur.update((byte) (ct >> 24 & 0xff));
- sm3keycur.update((byte) (ct >> 16 & 0xff));
- sm3keycur.update((byte) (ct >> 8 & 0xff));
- sm3keycur.update((byte) (ct & 0xff));
- sm3keycur.doFinal(key, 0);
- this.keyOff = 0;
- this.ct++;
- }
- public ECPoint Init_enc(SM2 sm2, ECPoint userKey)
- {
- AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.generateKeyPair();
- ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters) key.getPrivate();
- ECPublicKeyParameters ecpub = (ECPublicKeyParameters) key.getPublic();
- BigInteger k = ecpriv.getD();
- ECPoint c1 = ecpub.getQ();
- this.p2 = userKey.multiply(k);
- Reset();
- return c1;
- }
- public void Encrypt(byte data[])
- {
- this.sm3c3.update(data, 0, data.length);
- for (int i = 0; i < data.length; i++)
- {
- if (keyOff == key.length)
- {
- NextKey();
- }
- data[i] ^= key[keyOff++];
- }
- }
- public void Init_dec(BigInteger userD, ECPoint c1)
- {
- this.p2 = c1.multiply(userD);
- Reset();
- }
- public void Decrypt(byte data[])
- {
- for (int i = 0; i < data.length; i++)
- {
- if (keyOff == key.length)
- {
- NextKey();
- }
- data[i] ^= key[keyOff++];
- }
- this.sm3c3.update(data, 0, data.length);
- }
- public void Dofinal(byte c3[])
- {
- byte p[] = Util.byteConvert32Bytes(p2.getY().toBigInteger());
- this.sm3c3.update(p, 0, p.length);
- this.sm3c3.doFinal(c3, 0);
- Reset();
- }
- }
|