Kaynağa Gözat

attempting keypair test

Eric Foster 6 yıl önce
ebeveyn
işleme
092d18e096

+ 0
- 32
Crypto/src/ROT13.java Dosyayı Görüntüle

@@ -1,32 +0,0 @@
1
-import static java.lang.Character.isLowerCase;
2
-import static java.lang.Character.isUpperCase;
3
-import static java.lang.Character.toLowerCase;
4
-
5
-public class ROT13  {
6
-
7
-    ROT13(Character cs, Character cf) {
8
-    }
9
-
10
-    ROT13() {
11
-    }
12
-
13
-
14
-    public String crypt(String text) throws UnsupportedOperationException {
15
-
16
-        return "";
17
-    }
18
-
19
-    public String encrypt(String text) {
20
-        return text;
21
-    }
22
-
23
-    public String decrypt(String text) {
24
-        return text;
25
-    }
26
-
27
-    public static String rotate(String s, Character c) {
28
-
29
-        return "";
30
-    }
31
-
32
-}

+ 0
- 91
Crypto/src/ROT13Test.java Dosyayı Görüntüle

@@ -1,91 +0,0 @@
1
-import org.junit.Test;
2
-
3
-import static org.junit.Assert.*;
4
-
5
-public class ROT13Test {
6
-
7
-
8
-    @Test
9
-    public void rotateStringTest0() {
10
-        // Given
11
-        String s1 = "ABCDEF";
12
-        String s2 = "ABCDEF";
13
-
14
-        // When
15
-        ROT13 cipher = new ROT13();
16
-        String actual = cipher.rotate(s1, 'A');
17
-
18
-        // Then
19
-        assertTrue(actual.equals(s2));
20
-    }
21
-
22
-    @Test
23
-    public void rotateStringTest1() {
24
-        // Given
25
-        String s1 = "ABCDEF";
26
-        String s2 = "DEFABC";
27
-
28
-        // When
29
-        ROT13 cipher = new ROT13();
30
-        String actual = cipher.rotate(s1, 'D');
31
-
32
-        // Then
33
-        assertTrue(actual.equals(s2));
34
-    }
35
-
36
-    @Test
37
-    public void rotateStringTest2() {
38
-        // Given
39
-        String s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
40
-        String s2 = "NOPQRSTUVWXYZABCDEFGHIJKLM";
41
-
42
-        // When
43
-        ROT13 cipher = new ROT13();
44
-        String actual = cipher.rotate(s1, 'N');
45
-        System.out.println(s1);
46
-        System.out.println(actual);
47
-        // Then
48
-        assertTrue(actual.equals(s2));
49
-    }
50
-
51
-    @Test
52
-    public void cryptTest1() {
53
-        // Given
54
-        ROT13 cipher = new ROT13('a', 'n');
55
-
56
-        String Q1 = "Why did the chicken cross the road?";
57
-        String A1 = "Jul qvq gur puvpxra pebff gur ebnq?";
58
-
59
-        String Q2 = "Gb trg gb gur bgure fvqr!";
60
-        String A2 = "To get to the other side!";
61
-
62
-        // When
63
-        String actual = cipher.encrypt(Q1);
64
-        System.out.println(Q1);
65
-        System.out.println(A1);
66
-        // Then
67
-        assertTrue(actual.equals(A1));
68
-
69
-        // When
70
-        String actual2 = cipher.decrypt(Q2);
71
-        System.out.println(Q2);
72
-        System.out.println(A2);
73
-        // Then
74
-        assertTrue(actual2.equals(A2));
75
-    }
76
-    @Test
77
-    public void cryptTest2() {
78
-        // Given
79
-        ROT13 cipher = new ROT13('a', 'n');
80
-
81
-        String Q1 = "Why did the chicken cross the road?";
82
-        System.out.println(Q1);
83
-
84
-        // When
85
-        String actual = cipher.crypt(cipher.crypt(Q1));
86
-        System.out.println(actual);
87
-        // Then
88
-        assertTrue(actual.equals(Q1));
89
-    }
90
-
91
-}

+ 164
- 0
Crypto/src/main/java/ROT13.java Dosyayı Görüntüle

@@ -0,0 +1,164 @@
1
+import javax.crypto.BadPaddingException;
2
+import javax.crypto.Cipher;
3
+import javax.crypto.IllegalBlockSizeException;
4
+import javax.crypto.NoSuchPaddingException;
5
+import javax.crypto.spec.SecretKeySpec;
6
+
7
+import static java.lang.Character.isLowerCase;
8
+import static java.lang.Character.isUpperCase;
9
+
10
+import java.io.*;
11
+import java.security.*;
12
+import java.util.Base64;
13
+
14
+public class ROT13  {
15
+
16
+    private int shift;
17
+
18
+    ROT13(Character cs, Character cf) {
19
+        this.shift = cf - cs;
20
+    }
21
+
22
+    ROT13() {
23
+        this.shift = 13;
24
+    }
25
+
26
+    public String readFileToString(String filename) throws IOException {
27
+        StringBuilder sb = new StringBuilder();
28
+        BufferedReader br = new BufferedReader(new FileReader(filename));
29
+        String line = null;
30
+        while((line = br.readLine()) != null){
31
+            sb.append(line);
32
+            sb.append("\n");
33
+        }
34
+        return sb.toString();
35
+    }
36
+
37
+    public String cryptFile(String filename) throws IOException {
38
+        String s = readFileToString(filename);
39
+        return crypt(s);
40
+    }
41
+
42
+    public void writeFile(String filename, String content) throws IOException {
43
+        BufferedWriter bw = new BufferedWriter(new FileWriter(filename));
44
+        bw.write(content);
45
+        bw.close();
46
+    }
47
+
48
+    public String crypt(String text) throws UnsupportedOperationException {
49
+        return revolve(text, shift);
50
+    }
51
+
52
+    public String encrypt(String text) {
53
+        return revolve(text, shift);
54
+    }
55
+
56
+    public String decrypt(String text) {
57
+        return revolve(text, 26-shift);
58
+    }
59
+
60
+    public String revolve(String s, int revolve) {
61
+        char[] original = s.toCharArray();
62
+        char[] translated = new char[s.length()];
63
+        for (int i=0; i<original.length; i++) {
64
+            if (isLowerCase(original[i])) {
65
+                translated[i] = (char) ((((int) original[i] - (int) 'a' + revolve) % 26) + (int) 'a');
66
+            } else if (isUpperCase(original[i])) {
67
+                translated[i] = (char) ((((int) original[i] - (int) 'A' + revolve) % 26) + (int) 'A');
68
+            } else {
69
+                translated[i] = original[i];
70
+            }
71
+        }
72
+        return new String(translated);
73
+    }
74
+
75
+    public String rotate(String s, Character c){
76
+        if (c > 'A') {
77
+            return s.substring((s.length() - (c - 'A')), s.length()) + s.substring(0, s.length() - (c - 'A'));
78
+        } else {
79
+            return s;
80
+        }
81
+    }
82
+
83
+    public void AES() throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
84
+        String key = "dAtAbAsE98765432";
85
+        String key2 = "dAtAbAsE98765432dAtAbAsE98765432";
86
+        String expected = "Shall I compare thee to a summer’s day?\n" +
87
+                "Thou art more lovely and more temperate:\n" +
88
+                "Rough winds do shake the darling buds of May,\n" +
89
+                "And summer’s lease hath all too short a date;\n" +
90
+                "Sometime too hot the eye of heaven shines,\n" +
91
+                "And often is his gold complexion dimm'd;\n" +
92
+                "And every fair from fair sometime declines,\n" +
93
+                "By chance or nature’s changing course untrimm'd;\n" +
94
+                "But thy eternal summer shall not fade,\n" +
95
+                "Nor lose possession of that fair thou ow’st;\n" +
96
+                "Nor shall death brag thou wander’st in his shade,\n" +
97
+                "When in eternal lines to time thou grow’st:\n" +
98
+                "   So long as men can breathe or eyes can see,\n" +
99
+                "   So long lives this, and this gives life to thee.\n";
100
+        Key aesKey = new SecretKeySpec(key2.getBytes(), "AES");
101
+        Cipher cipher = Cipher.getInstance("AES");
102
+        cipher.init(Cipher.ENCRYPT_MODE, aesKey);
103
+        byte[] encrypted = cipher.doFinal(expected.getBytes());
104
+        String enc = new String(Base64.getEncoder().encodeToString(encrypted));
105
+        System.err.println("Encrypted: " + enc);
106
+        //During the decryption (Java 8):
107
+
108
+        System.out.print("Enter ciphertext: ");
109
+        encrypted = Base64.getDecoder().decode(enc);
110
+
111
+        cipher.init(Cipher.DECRYPT_MODE, aesKey);
112
+        String decrypted = new String(cipher.doFinal(encrypted));
113
+        System.err.println("Decrypted: " + decrypted);
114
+    }
115
+
116
+    public void publicPrivateKeyPair() throws NoSuchProviderException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
117
+        //Create a Key Pair Generator
118
+        KeyPairGenerator keyGenAlice = KeyPairGenerator.getInstance("DSA","SUN");
119
+        KeyPairGenerator keyGenBob = KeyPairGenerator.getInstance("DSA", "SUN");
120
+
121
+        //Initialize the Key Pair Generator
122
+        SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
123
+        keyGenAlice.initialize(1024,random);
124
+        keyGenBob.initialize(1024,random);
125
+
126
+        //Generate the Pair of Keys
127
+        KeyPair keyPairAlice = keyGenAlice.generateKeyPair();
128
+        PrivateKey privAlice = keyPairAlice.getPrivate();
129
+        PublicKey pubAlice = keyPairAlice.getPublic();
130
+        KeyPair keyPairBob = keyGenBob.generateKeyPair();
131
+        PrivateKey privBob = keyPairBob.getPrivate();
132
+        PublicKey pubBob = keyPairBob.getPublic();
133
+
134
+        String expected = "Shall I compare thee to a summer’s day?\n" +
135
+                "Thou art more lovely and more temperate:\n" +
136
+                "Rough winds do shake the darling buds of May,\n" +
137
+                "And summer’s lease hath all too short a date;\n" +
138
+                "Sometime too hot the eye of heaven shines,\n" +
139
+                "And often is his gold complexion dimm'd;\n" +
140
+                "And every fair from fair sometime declines,\n" +
141
+                "By chance or nature’s changing course untrimm'd;\n" +
142
+                "But thy eternal summer shall not fade,\n" +
143
+                "Nor lose possession of that fair thou ow’st;\n" +
144
+                "Nor shall death brag thou wander’st in his shade,\n" +
145
+                "When in eternal lines to time thou grow’st:\n" +
146
+                "   So long as men can breathe or eyes can see,\n" +
147
+                "   So long lives this, and this gives life to thee.\n";
148
+        Key aesKey = new SecretKeySpec(pubAlice.toString().getBytes(), "AES");
149
+        Cipher cipher = Cipher.getInstance("RSA");
150
+        cipher.init(Cipher.ENCRYPT_MODE, privAlice);
151
+        byte[] encrypted = cipher.doFinal(expected.getBytes());
152
+        String enc = new String(Base64.getEncoder().encodeToString(encrypted));
153
+        System.err.println("Encrypted: " + enc);
154
+        //During the decryption (Java 8):
155
+
156
+        System.out.print("Enter ciphertext: ");
157
+        encrypted = Base64.getDecoder().decode(enc);
158
+
159
+        cipher.init(Cipher.DECRYPT_MODE, aesKey);
160
+        String decrypted = new String(cipher.doFinal(encrypted));
161
+        System.err.println("Decrypted: " + decrypted);
162
+    }
163
+
164
+}

+ 231
- 0
Crypto/src/test/java/ROT13Test.java Dosyayı Görüntüle

@@ -0,0 +1,231 @@
1
+import org.junit.Test;
2
+
3
+import javax.crypto.BadPaddingException;
4
+import javax.crypto.IllegalBlockSizeException;
5
+import javax.crypto.NoSuchPaddingException;
6
+import java.io.IOException;
7
+import java.security.InvalidKeyException;
8
+import java.security.NoSuchAlgorithmException;
9
+import java.security.NoSuchProviderException;
10
+
11
+import static org.junit.Assert.*;
12
+
13
+public class ROT13Test {
14
+
15
+
16
+    @Test
17
+    public void rotateStringTest0() {
18
+        // Given
19
+        String s1 = "ABCDEF";
20
+        String s2 = "ABCDEF";
21
+
22
+        // When
23
+        ROT13 cipher = new ROT13();
24
+        String actual = cipher.rotate(s1, 'A');
25
+        System.out.println(s1);
26
+        System.out.println(actual);
27
+
28
+        // Then
29
+        assertTrue(actual.equals(s2));
30
+    }
31
+
32
+    @Test
33
+    public void rotateStringTest1() {
34
+        // Given
35
+        String s1 = "ABCDEF";
36
+        String s2 = "DEFABC";
37
+
38
+        // When
39
+        ROT13 cipher = new ROT13();
40
+        String actual = cipher.rotate(s1, 'D');
41
+        System.out.println(s1);
42
+        System.out.println(actual);
43
+
44
+        // Then
45
+        assertTrue(actual.equals(s2));
46
+    }
47
+
48
+    @Test
49
+    public void rotateStringTest2() {
50
+        // Given
51
+        String s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
52
+        String s2 = "NOPQRSTUVWXYZABCDEFGHIJKLM";
53
+
54
+        // When
55
+        ROT13 cipher = new ROT13();
56
+        String actual = cipher.rotate(s1, 'N');
57
+        System.out.println(s1);
58
+        System.out.println(actual);
59
+        // Then
60
+        assertTrue(actual.equals(s2));
61
+    }
62
+
63
+    @Test
64
+    public void cryptTest1() {
65
+        // Given
66
+        ROT13 cipher = new ROT13('a', 'n');
67
+
68
+        String Q1 = "Why did the chicken cross the road?";
69
+        String A1 = "Jul qvq gur puvpxra pebff gur ebnq?";
70
+
71
+        String Q2 = "Gb trg gb gur bgure fvqr!";
72
+        String A2 = "To get to the other side!";
73
+
74
+        // When
75
+        String actual = cipher.encrypt(Q1);
76
+        System.out.println(Q1);
77
+        System.out.println(A1);
78
+        System.out.println(actual);
79
+        // Then
80
+        assertTrue(actual.equals(A1));
81
+
82
+        // When
83
+        String actual2 = cipher.decrypt(Q2);
84
+        System.out.println(Q2);
85
+        System.out.println(A2);
86
+        System.out.println(actual2);
87
+        // Then
88
+        assertTrue(actual2.equals(A2));
89
+    }
90
+    @Test
91
+    public void cryptTest2() {
92
+        // Given
93
+        ROT13 cipher = new ROT13('a', 'n');
94
+
95
+        String Q1 = "Why did the chicken cross the road?";
96
+        System.out.println(Q1);
97
+
98
+        // When
99
+        String actual = cipher.crypt(cipher.crypt(Q1));
100
+        System.out.println(actual);
101
+        // Then
102
+        assertTrue(actual.equals(Q1));
103
+    }
104
+
105
+    @Test
106
+    public void cryptTxtFileTest() throws IOException {
107
+        // Given
108
+        ROT13 cipher = new ROT13('a', 'n');
109
+
110
+        String expected = "Shall I compare thee to a summer’s day?\n" +
111
+                "Thou art more lovely and more temperate:\n" +
112
+                "Rough winds do shake the darling buds of May,\n" +
113
+                "And summer’s lease hath all too short a date;\n" +
114
+                "Sometime too hot the eye of heaven shines,\n" +
115
+                "And often is his gold complexion dimm'd;\n" +
116
+                "And every fair from fair sometime declines,\n" +
117
+                "By chance or nature’s changing course untrimm'd;\n" +
118
+                "But thy eternal summer shall not fade,\n" +
119
+                "Nor lose possession of that fair thou ow’st;\n" +
120
+                "Nor shall death brag thou wander’st in his shade,\n" +
121
+                "When in eternal lines to time thou grow’st:\n" +
122
+                "   So long as men can breathe or eyes can see,\n" +
123
+                "   So long lives this, and this gives life to thee.\n";
124
+        System.out.println(expected);
125
+
126
+        // When
127
+        String actualE = cipher.cryptFile("sonnet18.txt");
128
+        String actual = cipher.decrypt(actualE);
129
+        System.out.println(actual);
130
+        // Then
131
+        assertTrue(actual.equals(expected));
132
+    }
133
+
134
+    @Test
135
+    public void readFileWriteFileTest() throws IOException {
136
+        // Given
137
+        ROT13 cipher = new ROT13('a', 'n');
138
+
139
+        String expected = "Shall I compare thee to a summer’s day?\n" +
140
+                "Thou art more lovely and more temperate:\n" +
141
+                "Rough winds do shake the darling buds of May,\n" +
142
+                "And summer’s lease hath all too short a date;\n" +
143
+                "Sometime too hot the eye of heaven shines,\n" +
144
+                "And often is his gold complexion dimm'd;\n" +
145
+                "And every fair from fair sometime declines,\n" +
146
+                "By chance or nature’s changing course untrimm'd;\n" +
147
+                "But thy eternal summer shall not fade,\n" +
148
+                "Nor lose possession of that fair thou ow’st;\n" +
149
+                "Nor shall death brag thou wander’st in his shade,\n" +
150
+                "When in eternal lines to time thou grow’st:\n" +
151
+                "   So long as men can breathe or eyes can see,\n" +
152
+                "   So long lives this, and this gives life to thee.\n";
153
+        System.out.println(expected);
154
+
155
+        cipher.writeFile("sonnet18e.txt", expected);
156
+        String actual = cipher.readFileToString("sonnet18e.txt");
157
+
158
+        assertTrue(actual.equals(expected));
159
+    }
160
+
161
+    @Test
162
+    public void cryptTxtFileWriteTest() throws IOException {
163
+        // Given
164
+        ROT13 cipher = new ROT13('a', 'n');
165
+
166
+        String expected = "Shall I compare thee to a summer’s day?\n" +
167
+                "Thou art more lovely and more temperate:\n" +
168
+                "Rough winds do shake the darling buds of May,\n" +
169
+                "And summer’s lease hath all too short a date;\n" +
170
+                "Sometime too hot the eye of heaven shines,\n" +
171
+                "And often is his gold complexion dimm'd;\n" +
172
+                "And every fair from fair sometime declines,\n" +
173
+                "By chance or nature’s changing course untrimm'd;\n" +
174
+                "But thy eternal summer shall not fade,\n" +
175
+                "Nor lose possession of that fair thou ow’st;\n" +
176
+                "Nor shall death brag thou wander’st in his shade,\n" +
177
+                "When in eternal lines to time thou grow’st:\n" +
178
+                "   So long as men can breathe or eyes can see,\n" +
179
+                "   So long lives this, and this gives life to thee.\n";
180
+        System.out.println(expected);
181
+
182
+        // When
183
+        String actualE = cipher.cryptFile("sonnet18.txt");
184
+        cipher.writeFile("sonnet18e.txt", actualE);
185
+        String actual = cipher.readFileToString("sonnet18e.txt");
186
+        assertTrue(actualE.equals(actual));
187
+
188
+        String original = cipher.decrypt(actual);
189
+        assertTrue(original.equals(expected));
190
+        System.out.println(actual);
191
+    }
192
+
193
+    @Test
194
+    public void testAES() throws IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException {
195
+        ROT13 cipher = new ROT13('a', 'n');
196
+        try {
197
+            cipher.AES();
198
+        } catch (NoSuchPaddingException e) {
199
+            e.printStackTrace();
200
+        } catch (NoSuchAlgorithmException e) {
201
+            e.printStackTrace();
202
+        } catch (InvalidKeyException e) {
203
+            e.printStackTrace();
204
+        } catch (BadPaddingException e) {
205
+            e.printStackTrace();
206
+        } catch (IllegalBlockSizeException e) {
207
+            e.printStackTrace();
208
+        }
209
+    }
210
+
211
+    @Test
212
+    public void testPublicKeyPrivateKey() throws NoSuchPaddingException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException, InvalidKeyException {
213
+        ROT13 cipher = new ROT13('a', 'n');
214
+        try {
215
+            cipher.publicPrivateKeyPair();
216
+        } catch (NoSuchProviderException e) {
217
+            e.printStackTrace();
218
+        } catch (NoSuchAlgorithmException e) {
219
+            e.printStackTrace();
220
+        } catch (NoSuchPaddingException e) {
221
+            e.printStackTrace();
222
+        } catch (InvalidKeyException e) {
223
+            e.printStackTrace();
224
+        } catch (BadPaddingException e) {
225
+            e.printStackTrace();
226
+        } catch (IllegalBlockSizeException e) {
227
+            e.printStackTrace();
228
+        }
229
+    }
230
+
231
+}

+ 16
- 0
SimpleCrypt.iml Dosyayı Görüntüle

@@ -0,0 +1,16 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
3
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
4
+    <output url="file://$MODULE_DIR$/target/classes" />
5
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
6
+    <content url="file://$MODULE_DIR$">
7
+      <sourceFolder url="file://$MODULE_DIR$/Crypto/src/main/java" isTestSource="false" />
8
+      <sourceFolder url="file://$MODULE_DIR$/Crypto/src/test/java" isTestSource="true" />
9
+      <excludeFolder url="file://$MODULE_DIR$/target" />
10
+    </content>
11
+    <orderEntry type="inheritedJdk" />
12
+    <orderEntry type="sourceFolder" forTests="false" />
13
+    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
14
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
15
+  </component>
16
+</module>

+ 20
- 0
pom.xml Dosyayı Görüntüle

@@ -7,6 +7,26 @@
7 7
     <groupId>com.zipcodewilmington</groupId>
8 8
     <artifactId>SimpleCrypt</artifactId>
9 9
     <version>1.0-SNAPSHOT</version>
10
+    <build>
11
+        <plugins>
12
+            <plugin>
13
+                <groupId>org.apache.maven.plugins</groupId>
14
+                <artifactId>maven-compiler-plugin</artifactId>
15
+                <configuration>
16
+                    <source>8</source>
17
+                    <target>8</target>
18
+                </configuration>
19
+            </plugin>
20
+        </plugins>
21
+    </build>
22
+    <dependencies>
23
+        <dependency>
24
+            <groupId>junit</groupId>
25
+            <artifactId>junit</artifactId>
26
+            <version>RELEASE</version>
27
+            <scope>test</scope>
28
+        </dependency>
29
+    </dependencies>
10 30
 
11 31
 
12 32
 </project>

+ 14
- 0
sonnet18e.txt Dosyayı Görüntüle

@@ -0,0 +1,14 @@
1
+Funyy V pbzcner gurr gb n fhzzre’f qnl?
2
+Gubh neg zber ybiryl naq zber grzcrengr:
3
+Ebhtu jvaqf qb funxr gur qneyvat ohqf bs Znl,
4
+Naq fhzzre’f yrnfr ungu nyy gbb fubeg n qngr;
5
+Fbzrgvzr gbb ubg gur rlr bs urnira fuvarf,
6
+Naq bsgra vf uvf tbyq pbzcyrkvba qvzz'q;
7
+Naq rirel snve sebz snve fbzrgvzr qrpyvarf,
8
+Ol punapr be angher’f punatvat pbhefr hagevzz'q;
9
+Ohg gul rgreany fhzzre funyy abg snqr,
10
+Abe ybfr cbffrffvba bs gung snve gubh bj’fg;
11
+Abe funyy qrngu oent gubh jnaqre’fg va uvf funqr,
12
+Jura va rgreany yvarf gb gvzr gubh tebj’fg:
13
+   Fb ybat nf zra pna oerngur be rlrf pna frr,
14
+   Fb ybat yvirf guvf, naq guvf tvirf yvsr gb gurr.