Blorgbeard
그는 물었다 12년 전
40

왜 나쁜 암호란이 &quot 올바르지 않으며, 패딩, 이로 인해 수행합니까 就不可能拥有 removed&quot?

그래서 내가 필요한 몇 가지 간단한 암호화 문자열을 작성했습니까 다음 코드 (상당한 &quot 함께 inspiration"; [here] 에서 1).

    // create and initialize a crypto algorithm
    private static SymmetricAlgorithm getAlgorithm(string password) {
        SymmetricAlgorithm algorithm = Rijndael.Create();
        Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes(
            password, new byte[] {
            0x53,0x6f,0x64,0x69,0x75,0x6d,0x20,             // salty goodness
            0x43,0x68,0x6c,0x6f,0x72,0x69,0x64,0x65
        }
        );
        algorithm.Padding = PaddingMode.ISO10126;
        algorithm.Key = rdb.GetBytes(32);
        algorithm.IV = rdb.GetBytes(16);
        return algorithm;
    }

    /* 
     * encryptString
     * provides simple encryption of a string, with a given password
     */
    public static string encryptString(string clearText, string password) {
        SymmetricAlgorithm algorithm = getAlgorithm(password);
        byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText);
        MemoryStream ms = new MemoryStream();
        CryptoStream cs = new CryptoStream(ms, algorithm.CreateEncryptor(), CryptoStreamMode.Write);
        cs.Write(clearBytes, 0, clearBytes.Length);
        cs.Close();
        return Convert.ToBase64String(ms.ToArray());
    }

    /*
     * decryptString
     * provides simple decryption of a string, with a given password
     */
    public static string decryptString(string cipherText, string password) {
        SymmetricAlgorithm algorithm = getAlgorithm(password);
        byte[] cipherBytes = Convert.FromBase64String(cipherText);
        MemoryStream ms = new MemoryStream();
        CryptoStream cs = new CryptoStream(ms, algorithm.CreateDecryptor(), CryptoStreamMode.Write);
        cs.Write(cipherBytes, 0, cipherBytes.Length);
        cs.Close();            
        return System.Text.Encoding.Unicode.GetString(ms.ToArray());
    }

단, 이 때, 데이터 해독을 통해 코드 작동합니다 &lt u&gt incorrect&lt /u>;; i get a 키를 크라이프트로그래프리스엑스티온 &quot 올바르지 않으며, 패딩 removed&quot 수 없습니다. - on cs. 선 () 에서 닫으십시오 데크리프트슈타링.

예제 코드:

    string password1 = "password";
    string password2 = "letmein";
    string startClearText = "The quick brown fox jumps over the lazy dog";
    string cipherText = encryptString(startClearText, password1);
    string endClearText = decryptString(cipherText, password2);     // exception thrown

내 질문은, 로만스였나 예상된 것입니다. 난 그냥 말도 안 되는 줄 것이라는 생각이 잘못된 암호를 해독하는 출력입니다 예외가 아닌 함께 발생할 수 있을 것 "이라고 말했다.

atconway
그는 7년 전 댓글을 달았습니다
6

나에게 너무 많은 시간을 함께 이 저장된 의견: 단, 이 때, '&quot 코드를 사용하여 데이터를 해독하는 작동합니다.' 난 갖고 있지만, 잘못된 key&quot swore 시동키는 복사됨 보았으매 2 배, 내가 didn& # 39 없다. 이 전에 다른 사람이 보면 패딩 메커니즘 또는 코드를 변경할 수 있기를 바랍니다.

답변 9 개

비록 이 이미 답변됨 좋은 방법이 될 것 같은데 왜 설명하란말야 것이 예상된다.

일반적으로 대부분의 암호 때문에 의미상 보안이며 않습니다를 필터링합니다 패딩 구성표는 발려짐 막기 위해 일부 형태의 크라이프트로이타크스. 예를 들어 RSA 오레프 일반적으로 사용할 수 있는 일부 신규인지 패딩 구성표는 공격의 (일반 텍스트 사탄들 같은 공격 또는 잘 안 보이는).

일부 (보통) 에 패딩 구성표가 첨부됩니다 무순서 쓰레기요 메시지 m 의 메시지를 전송하기 전에 오레프 신탁 사용하는 방법, 예를 들어, 2. (이 기능은 상투적이고 설명):

  1. 크기는 0 인 점을 고려할 때 지수 및 k0 비트 난수를 사용하는 k1 비트 패트 있습니다.
  2. 그 후 일부 transformation) 를 적용해 메시지가 메시지 및 승인에서 암호화됩니다 패딩 처리된 입수합니다 느릅 나무.

메시지와 함께 제공하는 방법을 사용하면 난수화) 의 경우 이 메시지는 테스트하려면 쓰레기요 방관하겠나 패딩 구성표는 해독할 때 메시지 등 되돌릴 수 없는 반면, 메시지 자체가 너회가 can& # 39 라고 무결성에 대해 아무것도 할 수 있습니다, 실제로 일부 어설션 정보 및 카타시안 패딩 다운로드되었는지 메시지 또는 you& 해독할 수 있습니다 잘못된 일을 올바로 # 39, re (이리에 누군가 잘못 사용하여 키 조작 여부를 메시지 또는 you& # 39, re)

stuck
그는 10년 전 댓글을 달았습니다
0

이 설명은 호르헤, 함께 해 주셔서 감사합니다. # 39 에 설명됨 같은 비헤이비어를 i& 보고, m, 데이터가 암호가 해독된 것은 맞습니다. 내가 하는 사람음식을 이 예외 또는 뭔가 잘못 하고, 내가 할 수 있는 # 39 m (그러길 바래야지) I& 맞나요?

도대체 무슨 잘못된 idfsysobject. 때 발생하며? # 39, ve I& 모든 게시물을 읽을 수 있도록 더 관심이 많은 사람들에 의해 작성된 것으로 idfsysobject. 사라지지는. i want my 현세생 내 경우에는 올바른 것으로:)

zaph
그는 4년 전 댓글을 달았습니다
1

39 의 질문에 대한 답변을 OP& 것은 아니며, 문제는 아닌 RSA 암호 같은 대칭 블록 암호 Rijndael 비대칭복사. 블록 암호 데이터에 대한 패딩 추가될 수 있도록 한 블록 크기, 일반적으로 사용하는 암호화됩니다 배수인지 PKCS # 7 (n& PKCS # 5 # 233, e). 이처럼 패딩 구성표과 임의적입니까 바이트입니다 않고 있다 "고 덧붙였다. 단, 패딩 ISO 는 임의의 바이트입니다 10126 철회와 모든 보안 추가 않았다. 그 경우 대칭 키 암호 패딩 요점이지 받게 될 것이라고 말했다. 제안: 이 질문에 대한 대답은 수리입니다 질문에 대답. 좀그, 수석 개발자.

Jorge Córdoba
그는 4년 전 댓글을 달았습니다
1

39 m, 보통 그냥 확보하십시오 @zaph I& 설명하는 대신 해독할 때 왜 잘못된 패딩 idfsysobject. 쓰레기요 사용 및 잘못된 암호란이. 예를 들어 rsa 그냥 및 특정 패딩 구성표가 사용되었다. 이 때문에 op 질문에 답을 썻냐면: 그래, 왜, 왜, 그리고 이에 대한 설명이 이상한 &quot here& 예상되며 # 39 의 padding"; 참조입니다 미디어만을 이해할 수 있는 경우, 그 이유는 이해할 수 있지만, 패딩 구성표는 이를 사용할 경우 아니하였으매 당혹스럽게 don& # 39, t (무슨 관련이 암호화는 패딩???)

zaph
그는 4년 전 댓글을 달았습니다
0

문제는 매우 다른 것을 설명할 수 있는 RSA 패딩 Rijndael 대한 패딩 진실이며당신이 수행되 이유는 달랐다. 좋아요, 그럼 사람들이 이해할 수 있는 RSA 암호화 및 대칭 및 비대칭복사 간의 차이점에 대해 혼동하지 말 것 같다, 많은 사람들이 더 적합할 때 사용하는 aesl RSA 더 잘 볼 수 있다. 그러나 포함되어 있는 경우 질문이예요 충족합니다 게 좋을 것 같다

저도 비슷한 경험이 &quot 올바르지 않으며, 패딩 removed.&quot 수 없습니다. 내 경우에는 예외가 있지만 정확한 키를 IV) 와 패딩 있었다.

Ts 는 암호화 플러시하는 것으로 드러나 이 모든 것이 없습니다.

다음과 같습니다.

            MemoryStream msr3 = new MemoryStream();
            CryptoStream encStream = new CryptoStream(msr3, RijndaelAlg.CreateEncryptor(), CryptoStreamMode.Write);
            encStream.Write(bar2, 0, bar2.Length);
            // unless we flush the stream we would get "Padding is invalid and cannot be removed." exception when decoding
            encStream.FlushFinalBlock();
            byte[] bar3 = msr3.ToArray();

sharpener
그는 6년 전 댓글을 달았습니다
1

이 같은 어떻게해야합니다 랑스트리엄스클로스 () ','.

user2173353
그는 4년 전 댓글을 달았습니다
2

아마 콩지름에 사용하여 해당 오브젝트를 쓸 수 있기 때문에 '' 에 있다. 될 수 있는 충분한.

Marc L.
그는 4년 전 댓글을 달았습니다
1

또한 함께 할 수 있는 간단한 ' () 는 일반적으로' 플러시합니다 스트리밍합니다 동일하게 플라우슈파이널브록 필요한 것은 ' ()' '크라이프트로스트림'. # 39 의 약간 모호한 that& 의 설명 앞에 코드입니다.

jbtule
그는 3년 전 댓글을 달았습니다
0

이는 이 질문에 대한 예외를 일으킬 계시나니 연관해제된 질문자 나쁜 암호란이 아닌 플러시하는) 에 나쁜 이유를 묻는 암호란이 인해 이 특정 예외가 아니다.

Michel Vaz Ramos
그는 3년 전 댓글을 달았습니다
0

내가 일한 경험이 경식도 동일한 문제가 및 플라우슈파이널브록 매력!!!

올바른 것으로 사용 스케쳐내 추가해야 합니다 인증 데이터베이스에구성원을 수 있도록 하는 것이 올바른 암호 enable-volume-set 암호화 텍스트 또는 암호화 텍스트 hasn& # 39, t 수정되었습니다. 패딩 [ISO10126] [2] 에서는 사용 중인 경우 예외가 doesn& 중 하나로, t # 39 마지막 바이트입니다 해독할 16 유효값 패딩에 (0x01 0x10). 그래서 니말은 1/16 투명지에 가능성이 있는 것은 잘못된 암호를 사용하여 공을 idfsysobject. 인증하려고 경우 이를 확인할 수 있는 경우 경우 강력한 암호 해독 유효합니다.

39 에 보이는 것이 아니라, 실제로 동시에 사용하여 암호화 api& 쉽게 사용할 수 있는 실수를 한다. 예를 들어 사용하면 소금, 즉, 모든 피하기 위해 고정식입니다 당신꺼에요 키와 iv 와 동일한 비밀번호를 암호화 텍스트 암호화되었습니다 it& 재사용합니다 끊는 의미 있는 # 39 의 IV, IV 와 CBC 모드에서 키 보안 요구 사항에 대해 고유하면 모두 사용할 수 있을 때, 예측할 수 없는 주요.

이러한 이유로 쉽게 만들 수 있는 실수, I have a 코드를 시도하시겠습니까 스니핏, 내가 계속 검토됨 및 최신임 (주석, 문제 itopia):

현대 예는 인증되며 문자열으로 대칭 암호화 C #.

39 (암호화 텍스트, 암호) '의' 아스텐마cae심프레데크리프트위스파스워드 it& 사용할 경우 잘못된 암호를 사용할 때 'null' 반환됨 경우 암호화 텍스트 또는 iv 수정되었습닌다 게시물로의 암호화에만 'null' 반환됨, 당신은 절대 프레젠테이션이든 정크 데이터를 다시 또는 패딩 예외가 아니다.

[2]: # iso10126 http://en.wikipedia.org/wiki/padding% 28cryptography% 29

39 you& 경우, ve 선형보간 아웃해야 주요 불일치합니다. 관심용 플라우슈파이널브록 목동들과 ' ()' (http://otl. yaniv& # 39 의 답) '를' () '의' 도 '크라이프트로스트림 닫으십시오 충분할 것입니다.

'반드시 함께 사용하는 경우 엄격히 지우는중 리소스에는' 블록 '블록' 자체에 대한 중첩할 크라이프트로스트림.

using (MemoryStream ms = new MemoryStream())
using (var enc = RijndaelAlg.CreateEncryptor())
{
  using (CryptoStream encStream = new CryptoStream(ms, enc, CryptoStreamMode.Write))
  {
    encStream.Write(bar2, 0, bar2.Length);
  } // implicit close
  byte[] encArray = ms.ToArray();
}

39, ve been i& 달린 이 (가) (또는 이와 유사한):

using (MemoryStream ms = new MemoryStream())
using (var enc = RijndaelAlg.CreateEncryptor())
using (CryptoStream encStream = new CryptoStream(ms, enc, CryptoStreamMode.Write))
{
  encStream.Write(bar2, 0, bar2.Length);
  byte[] encArray = ms.ToArray();
} // implicit close -- too late!

nawfal
그는 3년 전 댓글을 달았습니다
1

만일 너희가 랑스트리엄스프루시파이널브록 () ',' t you do it doesn& 꼭 이래야겠어요 solaris. # 39 매슈스토라리 () '' 어느 곳에 있든지 상관없이 '또는' & # 39 의 내부에 바깥쪽인지가 크라이프트로스트림 "사용 ').

jbtule
그는 3년 전 댓글을 달았습니다
0

39 의 OP know& it& # 39 의 주요 원인이 되는 이유를 묻는 질문에 불일치입니다 오류 및 주요 불일치입니다 인해 이 오류:.

또 다른 이유도 간 해독 논리를 사용하여 여러 스래드입니다 idfsysobject. 경합이 될 수 없습니다 - 기본 구현을 이스라이프트로트란스포르마 스레드 있다 (예를 들면 시메트리칼고리스만) 사용할 수 있는 전용 섹션을 둘 것인지, 그렇게 잠급니다. (예: 자세한 내용은 여기 참조하십시오. http://www.make-awesome.com/2011/07/system-security-cryptography-and-thread-safety/

예, 이 때 일어나는 것으로 예상, 아니면 적어도 그 정확히요 lionbridge 데이터 암호화 루틴을 비사양 데크리프터블 확보하십시오.

읽지 않은 바이트입니다 config. 크라이프트로스트림 있을 수 있다. 닫기와 스트림 읽기 전에 완전히 내 프로그램였어 원인이었습니다 오류

난 이미 비슷한 문제를 이슈로 해독하는 방법을 빈 메모리 스트리밍합니다 초기화중 있었다. 이 때 함께 할 때 다음과 같은 암호 텍스트를 바이트입니다 어레이입니다 협력했습니다 초기화되었습니다

MemoryStream ms = new MemoryStream(cipherText)

해답은 사용자가 업데이트되도록 &quot atconway"; 나를 위해 일했다.

그러나 핵심적인 패딩 문제가 없는 동안 암호화 및 해독 디스크입니다. 달랐다. 동일한 키를 iv 와 같은 값을 해독하는 니시프팅 동안 합니다.