Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

并发执行加密函数encode会导致失败 #23

Open
forest606 opened this issue Jun 3, 2019 · 11 comments
Open

并发执行加密函数encode会导致失败 #23

forest606 opened this issue Jun 3, 2019 · 11 comments

Comments

@forest606
Copy link

实际测试发现并发执行encode后,程序异常,解密失败,定位后发现是并发调用encode,encode能支持并发吗?

@BruceWind
Copy link
Owner

奇怪,应该不会这样子啊。你确定吗?

@BruceWind
Copy link
Owner

BruceWind commented Jun 3, 2019

是我代码里有static的字段吗, 我太久没看这个仓库了。如果有你试着改改。最近几天我上不了网。

@forest606
Copy link
Author

forest606 commented Jun 3, 2019

同步调用encode就没有问题,所以应该是并发引起的

确实有static字段:
static state_t* state;
// The array that stores the round keys.
static uint8_t RoundKey[176];
// The Key input to the AES Program
static const uint8_t* Key;
#if defined(CBC) && CBC
// Initial Vector used only for CBC mode
static uint8_t* Iv;
#endif

@forest606
Copy link
Author

解决了,将
static state_t* state;
static uint8_t RoundKey[176];
static const uint8_t* Key;
定义为局部变量,能够解决并发问题

@BruceWind
Copy link
Owner

BruceWind commented Jun 3, 2019

Okay, Can u give me a pull request? Thanx a lot.

@BruceWind
Copy link
Owner

If u have more suggestions for this repository, I can add you to an organization and we will maintain it together.

@forest606
Copy link
Author

好的,正在整理

@forest606
Copy link
Author

帮我设置为开发者吧,一直提示我没有权限push

AESJniEncrypt forest$ git push origin develop
ERROR: Permission to BruceWind/AESJniEncrypt.git denied to forest606.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

@forest606
Copy link
Author

From 889c28113ffdc90e29541a711750308c5b2af635 Mon Sep 17 00:00:00 2001
From: "forest.liu" forest606@gmail.com
Date: Mon, 3 Jun 2019 19:54:53 +0800
Subject: [PATCH] Support concurrently call encrypt and decrypt


aesjni/src/main/cpp/aes.c | 74 +++++++++++++++++++++++------------------------
1 file changed, 37 insertions(+), 37 deletions(-)

diff --git a/aesjni/src/main/cpp/aes.c b/aesjni/src/main/cpp/aes.c
index 9f8a572..185c7eb 100644
--- a/aesjni/src/main/cpp/aes.c
+++ b/aesjni/src/main/cpp/aes.c
@@ -62,13 +62,13 @@ NOTE: String length must be evenly divisible by 16byte (str_len % 16 == 0)
/*****************************************************************************/
// state - array holding the intermediate results during decryption.
typedef uint8_t state_t[4][4];
-static state_t* state;
+//static state_t* state;

// The array that stores the round keys.
-static uint8_t RoundKey[176];
+//static uint8_t RoundKey[176];

// The Key input to the AES Program
-static const uint8_t* Key;
+//static const uint8_t* Key;
#if defined(CBC) && CBC
// Initial Vector used only for CBC mode
static uint8_t* Iv;
@@ -151,7 +151,7 @@ static uint8_t getSBoxInvert(uint8_t num)
}

// This function produces Nb(Nr+1) round keys. The round keys are used in each round to decrypt the states.
-static void KeyExpansion(void)
+static void KeyExpansion(uint8_t *RoundKey, const uint8_t *Key)
{
uint32_t i, j, k;
uint8_t tempa[4]; // Used for the column/row operations
@@ -218,7 +218,7 @@ static void KeyExpansion(void)

// This function adds the round key to state.
// The round key is added to the state by an XOR function.
-static void AddRoundKey(uint8_t round)
+static void AddRoundKey(state_t* state, uint8_t *RoundKey, uint8_t round)
{
uint8_t i,j;
for(i=0;i<4;++i)
@@ -232,7 +232,7 @@ static void AddRoundKey(uint8_t round)

// The SubBytes Function Substitutes the values in the
// state matrix with values in an S-box.
-static void SubBytes(void)
+static void SubBytes(state_t* state)
{
uint8_t i, j;
for(i = 0; i < 4; ++i)
@@ -247,7 +247,7 @@ static void SubBytes(void)
// The ShiftRows() function shifts the rows in the state to the left.
// Each row is shifted with different offset.
// Offset = Row number. So the first row is not shifted.
-static void ShiftRows(void)
+static void ShiftRows(state_t* state)
{
uint8_t temp;

@@ -281,7 +281,7 @@ static uint8_t xtime(uint8_t x)
}

// MixColumns function mixes the columns of the state matrix
-static void MixColumns(void)
+static void MixColumns(state_t* state)
{
uint8_t i;
uint8_t Tmp,Tm,t;
@@ -319,7 +319,7 @@ static uint8_t Multiply(uint8_t x, uint8_t y)
// MixColumns function mixes the columns of the state matrix.
// The method used to multiply may be difficult to understand for the inexperienced.
// Please use the references to gain more information.
-static void InvMixColumns(void)
+static void InvMixColumns(state_t* state)
{
int i;
uint8_t a,b,c,d;
@@ -340,7 +340,7 @@ static void InvMixColumns(void)

// The SubBytes Function Substitutes the values in the
// state matrix with values in an S-box.
-static void InvSubBytes(void)
+static void InvSubBytes(state_t* state)
{
uint8_t i,j;
for(i=0;i<4;++i)
@@ -352,7 +352,7 @@ static void InvSubBytes(void)
}
}

-static void InvShiftRows(void)
+static void InvShiftRows(state_t* state)
{
uint8_t temp;

@@ -382,54 +382,54 @@ static void InvShiftRows(void)

// Cipher is the main function that encrypts the PlainText.
-static void Cipher(void)
+static void Cipher(state_t* state, uint8_t *RoundKey)
{
uint8_t round = 0;

// Add the First round key to the state before starting the rounds.

  • AddRoundKey(0);
  • AddRoundKey(state, RoundKey, 0);

    // There will be Nr rounds.
    // The first Nr-1 rounds are identical.
    // These Nr-1 rounds are executed in the loop below.
    for(round = 1; round < Nr; ++round)
    {

  • SubBytes();
  • ShiftRows();
  • MixColumns();
  • AddRoundKey(round);
  • SubBytes(state);
  • ShiftRows(state);
  • MixColumns(state);
  • AddRoundKey(state, RoundKey, round);
    }

// The last round is given below.
// The MixColumns function is not here in the last round.

  • SubBytes();
  • ShiftRows();
  • AddRoundKey(Nr);
  • SubBytes(state);
  • ShiftRows(state);
  • AddRoundKey(state, RoundKey, Nr);
    }

-static void InvCipher(void)
+static void InvCipher(state_t* state, uint8_t *RoundKey)
{
uint8_t round=0;

// Add the First round key to the state before starting the rounds.

  • AddRoundKey(Nr);
  • AddRoundKey(state, RoundKey, Nr);

    // There will be Nr rounds.
    // The first Nr-1 rounds are identical.
    // These Nr-1 rounds are executed in the loop below.
    for(round=Nr-1;round>0;round--)
    {

  • InvShiftRows();
  • InvSubBytes();
  • AddRoundKey(round);
  • InvMixColumns();
  • InvShiftRows(state);
  • InvSubBytes(state);
  • AddRoundKey(state, RoundKey, round);
  • InvMixColumns(state);
    }

// The last round is given below.
// The MixColumns function is not here in the last round.

  • InvShiftRows();
  • InvSubBytes();
  • AddRoundKey(0);
  • InvShiftRows(state);
  • InvSubBytes(state);
  • AddRoundKey(state, RoundKey, 0);
    }

static void BlockCopy(uint8_t* output, uint8_t* input)
@@ -453,26 +453,26 @@ void AES128_ECB_encrypt(uint8_t* input, const uint8_t* key, uint8_t* output)
{
// Copy input to output, and work in-memory on output
BlockCopy(output, input);

  • state = (state_t*)output;
  • state_t* state = (state_t*)output;
  • Key = key;
  • KeyExpansion();
  • uint8_t RoundKey[176] = {0};

  • KeyExpansion(RoundKey, key);

    // The next function call encrypts the PlainText with the Key using AES algorithm.

  • Cipher();
  • Cipher(state, RoundKey);
    }

void AES128_ECB_decrypt(uint8_t* input, const uint8_t* key, uint8_t *output)
{
// Copy input to output, and work in-memory on output
BlockCopy(output, input);

  • state = (state_t*)output;
  • state_t* state = (state_t*)output;

    // The KeyExpansion routine must be called before encryption.

  • Key = key;
  • KeyExpansion();
  • uint8_t RoundKey[176] = {0};
  • KeyExpansion(RoundKey, key);
  • InvCipher();
  • InvCipher(state, RoundKey);
    }

/**

2.13.2

@BruceWind
Copy link
Owner

BruceWind commented Jun 4, 2019

#23 (comment)

sorry,the reply is late.
u can do this:
1.fork the repo to your github.
2.modify code.
3.push code to your repo.
4.create a pull request to my repo.

@BruceWind BruceWind mentioned this issue Jun 21, 2019
@BruceWind
Copy link
Owner

Sorry ever one, AES is no longer supported.
I have pushed code that use chacah20 instead of AES. #40

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants