2013-04-13 2 views
-2

OTP (One Time Pad) 암호화로 C 프로그램을 만들려고합니다. 이 프로그램은 사용자가 암호화 할 문자열을 사용합니다. 그런 다음 키를 가져 오기 전에 (정수로) 키의 길이를 요청해야합니다. 프로그램이 100 % 정확하기를 원하기 때문에 키의 길이에 제약을 가하고 있습니다. 우리가 알고 있듯이, OTP에서 키의 길이는 텍스트의 길이를 초과 할 수 없습니다. 그렇다면 어떻게 그러한 필터를 구현할 수 있습니까? 코드 생성을 시도했지만 작동하지 않습니다. '렌'도 '렌'의 값에 문자열의 길이를 초과 할 수 없습니다 스캔하는 동안어떻게 문자를 입력하도록 사용자를 제한 할 수 있으며 C에서 지정된 길이보다 큰 정수를 사용할 수 있습니까?

//An Under-Construction program to implement OTP (One time Pad) encryption  
#include "stdio.h" 
#include "cstring" 
#include "ctype.h" 
int main() 
{ 
    char str[10000], key[10000]; 
    printf("Enter the string:- "); 
    scanf("%[^\n]", str); //stops scanning when user presses return 

    int len /* stores the number of digits of the OTP key*/, isalphabet=0; 
     do 
     { 
      printf("What is the length of the key you are entering?:-"); 
      scanf("%d", &len); 

      if(isalpha(len)) // Checks if len is a character 
      { 
       isalphabet=NULL; //isalphabet becomes NULL if it is a character and not an integer 
      } 


     } while (len > strlen(str) || isalphabet == NULL); //reiterate the loop until the conditions are satisfied 

     for(int i = 0; i < len; i++) 
    { 
     printf("%dth digit of Key= ", i+1); 
     scanf("%d", &key[i]); 
    } 
    return(0); 
} 

내가 원하는 사용자로부터 만 정수 값을 취할 수있는 프로그램 : 여기

코드입니다 이러한 조건이 충족되지 않으면 루프를 반복합니다. 누군가 내 실수를 지적하고 그 해결책을 보여줄 수 있습니까? 또한 코드가 왜 작동하지 않는지에 대한 이유를 설명해주십시오.

+0

확실히 키가 텍스트보다 짧아야합니다. 그렇지 않으면 암호화를 해독 할 수있는 키를 반복해야합니다. –

+0

@Arlene 특정 문제에 대해 설명해주십시오. –

+0

@ NicholasWilson : 이상적으로는 암호를 100 % uncrackable로 만들려면 키가 텍스트만큼 길어야합니다. 모든 경우에서 이것이 가능하지 않기 때문에 키는 가능한 한 길어야하지만 NO CASE는 암호화 할 텍스트의 길이를 초과 할 수 있습니다. –

답변

0

체크 scanf("%d", len); 어딘가에 &가 누락 되었습니까? 또한 len

업데이트를 초기화 : - 늦어서 죄송합니다, OKK는, 실제로 당신이 해결해야 할 몇 가지있다, 미안 먼저 게시물을 지적하지 않았다.

1) 헤더 포함 구분 기호를 수정하십시오. 읽은 후 len = 0

3) 플러시 표준 입력을 초기화 <stdio.h> 대신)

2 "stdio.h"의를 사용합니다. 실제로 숯을 입력하면 scanf(%d,&len)은 그것을 지우거나 읽지 않을 것입니다. 그래서 당신은 stdin에 갇혀있는 숯 때문에 무한 루프에 갇혀있을 것입니다. 마지막 for 루프에도 동일하게 적용됩니다. 다행스럽게도 여기서 멈추지는 않겠지 만 루프가 너무 일찍 끝날 것입니다.

4) isalphabet=NULL, isalphabet는 int이며, 기본적으로 NULL 인 0x0 값을 가진 void 포인터이며, int에 0을 할당해야합니다.

5) 그래서 당신은 isalphabet = 0으로 루프 안에 들어 왔고 숫자는 알파벳이 아니며 isalphabet을 만지지 않았고 while 루프의 끝 부분 인 isalphabet==NULL으로 여기에 실제로 실행됩니다. 루프가 시작됩니다. 루프 차단 조건은 언제 isalphabet으로 설정됩니까?

6) cstring을 C 코드로 사용하는 이유는 무엇입니까? 왜 안 string.h (그러나 이것은 개인적인 선택 :)의 더)가

//An Under-Construction program to implement OTP (One time Pad) encryption  
#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
int main() 
{ 
    char str[10000], key[10000]; 
    printf("Enter the string:- "); 
    scanf("%[^\n]", str); //stops scanning when user presses return 

    int len /* stores the number of digits of the OTP key*/, isalphabet=0; 
     do 
     { 
      printf("What is the length of the key you are entering?:-"); 
      scanf("%d", &len); 
      fflush(stdin); 

      if(isalpha(len)) // Checks if len is a character 
      { 
       isalphabet=1; //isalphabet becomes NULL if it is a character and not an integer 
      } 


     } while (len >= strlen(str) || isalphabet == 1); //reiterate the loop until the conditions are satisfied 

     int i; 
     for(i = 0; i < len; i++) 
    { 
     printf("%dth digit of Key= ", i+1); 
     scanf("%d", &key[i]); 
    } 
    return(0); 
} 
+0

scanf ("% d", len)를 scanf ("% d", & len)로 바꾸어 코드를 편집했지만 여전히 작동하지 않습니다. –

+0

친애하는 친구 감사합니다. 코드가 실제로 작동합니다! 일부 회원이 내 질문을 이해하지 못했거나 답변을 얻지 못했고 2로 부정적으로 표시 한 것처럼 보입니다. 그러나 해결책을 찾기 위해 애를 썼습니다. 큰 도움이되었습니다. 다시 한번 고마워요. –

+0

행복하게 도와 드리겠습니다. 결코 시험해 보지 마십시오. 아무런 질문도하지 않습니다. :) – abasu

0

첫째, scanf와 작동하면 내가 조금 편집 len > strlen(

len >= strlen에 확인 수정

7) ("% d", len);

scanf("%d", &len); 

나 strlen (STR)는 길이를 반환해야하고, 알파 또는없는 경우, while 루프 내부에서 수행 할 수의 비교

len > (strlen(str) -1) 

과 비교를해야한다. 이 코드를 확인하십시오.

#include "stdio.h" 
#include "string.h" 
#include "ctype.h" 

#define TRUE 1 
#define FALSE 0 

int main() 
{ 
    char str[10000]; 
    char key[10000]; 

    printf("Enter the string:- "); 
    scanf("%[^\n]", str); //stops scanning when user presses return 

    int len = 0; 
    int isalphabet= TRUE; 
    int apply = 1; 
    do 
    { 
     printf("What is the length of the key you are entering?:-"); 
     scanf("%d", &len); 

     isalphabet= isalpha(len); 
     apply = (len > (strlen(str) -1)) ; 

    } while (!apply || isalphabet); //reiterate the loop until the conditions are satisfied 

    int i; 
    for(i = 0; i < len; i++) 
    { 
     printf("%dth digit of Key= ", i+1); 
     scanf("%c\n", &key[i]); 
    } 

    for(i = 0; i < len; i++){ 
     printf("key[%d] = %c\n", i, key[i]); 
    } 
    return(0); 
} 
+0

수정 된 코드를 제공해 주셔서 감사합니다. 나는 코드를 컴파일하고 실행했지만 'len'은 문자열의 길이보다 큰 길이를 허용합니다. 또한 장난 꾸러기 사용자가 'len'값으로 문자 (예 : - 'a')를 입력하면 프로그램이 부적절한 상태가됩니다. –