When the plain text is 128 bytes, encrypt/decrypt failed.

Charles Wang charlesw123456 at gmail.com
Wed Jan 21 14:09:10 CET 2009


I'm using libgcrypt-1.4.3. When I try to use RSA to encrypt and decrypt my
data, libgcrypt failed in case. I'm very confused. So I write the following

#include  <stdio.h>
#include  <stdlib.h>
#include  <gcrypt.h>

static void random_set(unsigned char * buf, size_t szbuf)
    long rval;
    unsigned char * cur, * last = buf + szbuf;
    for (cur = buf; cur + sizeof(rval) <= last; cur += sizeof(rval)) {
	rval = random();
	memcpy(cur, &rval, sizeof(rval));
    if (cur < last) {
	rval = random();
	memcpy(cur, &rval, last - cur);

static void show_sexp(const char * prompt, gcry_sexp_t sexp)
    char dumpbuf[4096];
    gcry_sexp_sprint(sexp, GCRYSEXP_FMT_ADVANCED, dumpbuf, sizeof(dumpbuf));
    printf("%s: %s\n", prompt, dumpbuf);
static void show_mpi(const char * prompt, gcry_mpi_t mpi)
    char dumpbuf[4096];
    gcry_mpi_print(GCRYMPI_FMT_HEX, dumpbuf, sizeof(dumpbuf), NULL, mpi);
    printf("%s: %s\n", prompt, dumpbuf);

int main(void)
    int count;
    int nbits_data;
    gcry_sexp_t key_spec, key, pubkey, privkey;
    gcry_sexp_t plain0, cipher, plain1;
    gcry_mpi_t x0, x1;
    unsigned char xbuf0[128], xbuf1[128];
    size_t nwritten;

    gcry_control(GCRYCTL_DISABLE_SECMEM, 0);
    if (!gcry_check_version(GCRYPT_VERSION)) {
	fprintf(stderr, "version check failed.\n");
    gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0);

    gcry_sexp_new(&key_spec, "(genkey (rsa (nbits 4:1024)))", 0, 1);
    gcry_pk_genkey(&key, key_spec);

    pubkey = gcry_sexp_find_token(key, "public-key", 0);
    privkey = gcry_sexp_find_token(key, "private-key", 0);
    show_sexp("public-key", pubkey);
    show_sexp("private-key", privkey);

    nbits_data = 1016;

    for (count = 0; count < 8192; ++count) {
	random_set(xbuf0, sizeof(xbuf0));
	gcry_mpi_scan(&x0, GCRYMPI_FMT_USG, xbuf0, nbits_data / 8, NULL);
	/*gcry_mpi_randomize(x0, nbits_data, GCRY_WEAK_RANDOM);*/
	gcry_sexp_build(&plain0, NULL, "(data (flags raw) (value %m))", x0);
	show_sexp("plain0", plain0);

	gcry_pk_encrypt(&cipher, plain0, pubkey);
	show_sexp("cipher", cipher);
	gcry_pk_decrypt(&plain1, cipher, privkey);
	show_sexp("plain1", plain1);

	x1 = gcry_sexp_nth_mpi(plain1, 0, GCRYMPI_FMT_USG);
	show_mpi("x0", x0);
	show_mpi("x1", x1);
	gcry_mpi_print(GCRYMPI_FMT_USG, xbuf1, sizeof(xbuf1), &nwritten, x1);

	printf("%03d: cmp = %d, cmp = %d\n", count, gcry_mpi_cmp(x0, x1),
	       memcmp(xbuf0, xbuf1, nwritten));


    return 0;

When nbits_data > 1016 ( 127 bytes ), libgcrypt failed by chance. But if
nbits_data <= 1016, libgcrypt always success! Is this is a correct way or my
code is wrong? I have noticed that 'pubkey.c' in libgcrypt-1.4.3/tests use
800 for nbits_data.

Thanks greatly.

The previous file is provided as an attachment too.
http://www.nabble.com/file/p21582842/tryrsa.c tryrsa.c 

Charles Wang
View this message in context: http://www.nabble.com/When-the-plain-text-is-128-bytes%2C-encrypt-decrypt-failed.-tp21582842p21582842.html
Sent from the GnuPG - User mailing list archive at Nabble.com.

More information about the Gnupg-users mailing list