Blowfishで暗号化したい「3.9389005e-01」などの浮動小数点データがあります。strtodは、文字列からfloatを取得するために使用されます。
ただし、Blowfishは整数のみを暗号化します。
したがって、私の計画では、各FP値を仮数と指数の2つの整数として暗号化します。次に、2つの別々の暗号化された値として保存します。
復号化により、仮数と指数が返され、元のFP番号の再構成が可能になります。
きちんとした解決策はありますか?
ブローフィッシュのデモコードはこちらです。
他のポインターと同じように、任意のポインターにアクセスできます。データは別のデータ型として意味がないかもしれませんが、可能です:
double value = 123.456;
int *ptr = (int *) &value;
これで、暗号化できるsizeof(double)バイト (または整数)のメモリ領域へのポインタができました。sizeof(double) / sizeof(int)
復号化後に元に戻すには、次のdoubleようにします。
double new_value = *((double *) ptr);
コードで FP 値を文字列に変換してから文字列を暗号化し、後で正確なFP 値を取得したい場合は、FP 番号を十分な精度で変換する必要があります。"%.*e"and DBL_DECIMAL_DIG(または利用できない場合)を使用しDBL_DIG + 3ます。
#include <float.h>
// sign digit . fraction e sign expo \0 CYA
#define FP_BUF_SIZE (1+1+1+ (DBL_DECIMAL_DIG-1) + 1 + 1 + 4 + 1 + 10)
double x;
char buf[FP_BUF_SIZE];
sprintf(buf, "%.*e", DBL_DECIMAL_DIG - 1, x);
Encode(buf);
浮動小数点値の精度を維持するためのRef Printf 幅指定子
または、コードで使用できますsprintf(buf, "%a", x);
暗号化する必要のある と同じサイズの配列のunion間でを宣言します。doubleuint8_t
暗号化するには、二重に入力し、バイトを暗号化します。復号化するには、バイトを復号化し、double を読み取ります。
このアプローチは、使用する暗号が同じサイズのメッセージを出力する場合、バイト以外のデータ型に拡張できます。
uint8_t *パディングの場合、「データがwill sometimes work, sometimes not; AES-256 will work with adouble of size 8, but block implementations are liable to crash or corrupt data when working with afloat floatであるものを取得する」というより高速なアプローチでは、of size 4 (they will attempt to read 8 bytes, and write 8 bytes; where only four are actually available). Due to platform and compiler quirks, this may *still* work because after the利用可能な「メモリ パディング」が存在する可能性があります。
安全のために、たとえば暗号が 256 ビット (32 バイト) にパディングされている場合、同様にパディングされるようにバイト配列の長さを修正する必要があります。これを行うためのあまりきれいではない方法の 1 つは、パディング カウント全体でバイト カウントを増やすことです。
#include <stdio.h>
typedef struct {
double a;
long v;
// Whatever else.
// ...
} payload_t;
union {
payload_t payload;
unsigned char bytes[sizeof(payload_t)+32]; // 256 bits of margin
} data;
int main(void)
{
data.payload.a = 3.14159;
data.payload.v = 123456789;
...
// Encrypt data.bytes, for a length integer multiple of 32 bytes
size_t length = ((sizeof(payload_t)+31)/32)*32;